NOIP2008火柴棒等式 求神牛更正程序
给你n根火柴棒,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棒拼出的整数(若该数非零,则最高位不能是0)。用火柴棒拼数字0--9的拼法如图所示:注意:1.加号与等号各自需要2根火柴棒2.如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)3.n根火柴棒必须全部用上【输入】 输入文件matches.in共一行,有一个整数n(n<=24)。【输出】 输出文件matches.out共一行,有一个整数,表示能拼成的不同等式的数目。【输入输出样例1】matches.in18matches.out9【输入输出样例2解释】9个等式为:0+4=40+11=111+10=112+2=42+7=94+0=47+2=910+1=1111+0=11 我的思路: 穷举0~999 + 0~999 的数的 各种情况 {显然会超时} 所以我打表 比如找到了 一种解 (火柴棒<=24-4 ) 就把它记录在data[火柴棒数] +1 这样 我就可以得到 除去+ = 号以外 的 火柴数data 0-20 的 总数 然后在生成另一个程序 打一个表格 它问哪种情况就把哪种情况输出就行了 这种思路不会错吧 可是程序实现时 运行显示 错误 201 范围差错 不知道怎么回事 求解 下面是我的程序 望神牛给回答 program db;constnum:array[0..9]of integer=((6),(2),(5),(5),(4),(5),(6),(3),(7),(6));vari,j:integer;data:array[1..20] of integer;flag:array[0..999] of boolean; function ss(c:integer):longint;{计算火柴棒数} begin ss:=0; if c<=9 then begin ss:=num[i]; exit; end; repeat inc(ss,num[c mod 10]); c:=c div 10; until c<=0; end; procedure deal;{每种 i+j 情况的 运算} var o:integer; temp,k1,k2:longint; begin o:=i+j; temp:=ss(o); k1:=ss(i); k2:=ss(j); if temp+k1+k2<=20 then{使用火柴棒数小于等于20时 记录在相应情况中} inc(data[temp+k1+k2]); end;beginfillchar(flag,sizeof(flag),true);fillchar(data,sizeof(data),0); for i:= 0 to 90 do for j:= 0 to 90 do begin if (i=j) then begin if flag[i] then begin deal; flag[i]:=false; end; end else deal; end; for i:= 1 to 20 do write(data[i],✀ ✀);end.for i:= 0 to 999 do for j:= 0 to 999 do