zoukankan      html  css  js  c++  java
  • [2013.10.11]P3.和为零

    描述

    周老师最近在研究一个有趣的数学方面的问题:

    一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。

    现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。

    计算该表达式的结果并注意你是否得到了和为零。

    请你写一个程序找出所有产生和为零的长度为N的数列。

    输入单独的一行表示整数N (3 <= N <= 9)。输出按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列。(注意:就算两个数字之间没有插入符号也应该保留空格)

    样例输入

    7
    

    样例输出

    1+2-3+4-5-6+7
    1+2-3-4+5+6-7
    1-2 3+4+5+6+7
    1-2 3-4 5+6 7
    1-2+3+4-5+6-7
    1-2-3-4-5+6+7






    这题明显是搜索,看数据范围3~9
    3显然是因为1,2不能满足、

    Search(i,Tt,xx,ch);
    i 是位置(0~N),Tt存放上一次运算至今的数额,xx为算式答案,ch为'+'/'-'/' ';
    Search(0,0,0,'+')、
    题目要求按照ASCII顺序输出,估计原因有两点
    1.看看你知不知道怎么做、、避免瞎搜AC
    2.懒得写SPJ(纯属玩笑、、、)
    所以' '>'+'>'-' (搜索顺序)

    “主程序很短,写起来很爽。”——王建德于某年SDSC 主程序3行,过程100+、、(唉、、、)

    然后是程序的Procedure(void)
    //被Cpp们刺激了,所以有了以下四不像伪代码、、
    {
    if
    (i=n)//结束标志,i=n
    { xx=+Tt;//算式球最终值 if (xx=0)
    {
    for i=0->n*2-1 do write(st[i]); Writeln; }//输出
    Exit; } if (ch=' ')//空格时对该为的数进行修正
    { if (Tt<0) Tt=Tt*10-i-1 else Tt=Tt*10+i+1; }
    else { xx=+Tt;//对当前位置求值,因为Tt保存的是含+/-,所以不需考虑到底是+还是-,直接+上即可 Tt=i+1; if (ch='-') Tt:=-Tt;//如果是-,Tt*(-1),觉得不清楚可以拆成两个else来写 }
    St[2*i]=Chr(i+49);//赋值i+1 if (i=n-1) //此时n后面不需要再加一些奇怪的东西,除了空格(空格其实也不应该、、、,所以输出时无视掉)
    { st[2*i+1]=' '; Search(i+1,Tt,xx,' '); Exit; }
    st[2*i+1]=' '; Search(i+1,Tt,xx,' '); st[2*i+1]='+'; Search(i+1,Tt,xx,'+'); st[2*i+1]='-'; Search(i+1,Tt,xx,'-');//按照ASCII顺序搜索、、
    }

    OpenJudge上测0ms AC (7个点居然显示98分,我明明写的100分。真是.....)
    校内Vijos同分//话说Vijos开了格式判断,Openjudge没有,开始多输了个空格、、、、、
     1 Var
     2   i,n:longint;
     3   xx,Tt:longint;
     4   st:array[0..20] of char;
     5 Procedure Search(i,Tt,xx:longint;ch:Char);
     6   Begin
     7     if i=n Then
     8       Begin
     9         xx:=xx+Tt;
    10         if xx=0 Then
    11           Begin
    12             For i:=0 to n*2-2 do write(st[i]);
    13             Writeln;
    14           End;
    15         Exit;
    16       End;
    17     if ch=' ' Then
    18       Begin
    19         if Tt<0 Then Tt:=Tt*10-i-1
    20         Else Tt:=Tt*10+i+1;
    21       End
    22     Else
    23       Begin
    24         xx:=xx+Tt;
    25         Tt:=i+1;
    26         if ch='-' Then Tt:=-Tt;
    27       End;
    28     St[2*i]:=Chr(i+49);
    29     if i=n-1 Then
    30       Begin
    31         st[2*i+1]:=' ';
    32         Search(i+1,Tt,xx,' ');
    33         Exit;
    34       End;
    35     st[2*i+1]:=' ';
    36     Search(i+1,Tt,xx,' ');
    37     st[2*i+1]:='+';
    38     Search(i+1,Tt,xx,'+');
    39     st[2*i+1]:='-';
    40     Search(i+1,Tt,xx,'-');
    41   End;
    42 Begin
    43   Read(n);
    44   Search(0,0,0,'+')
    45 End.
    46 (Done By Catch-22.S.Iris 2013/10/12)
  • 相关阅读:
    Docker 镜像
    Docker 安装命令
    Docker 基本概念
    Redis 高可用之"持久化"
    Git 安装和使用
    oracle角色
    oracle权限
    审计
    手动创建数据库
    oracle口令文件认证
  • 原文地址:https://www.cnblogs.com/Catch-22/p/3367051.html
Copyright © 2011-2022 走看看