[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)

 

posted @ 2013-10-13 21:09  Iris.Catch-22.S、`  阅读(161)  评论(0编辑  收藏  举报