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