这题就是搜……
注意设定maxn 要不然肯定爆 maxn=1*10^最大位数/2 1234..89-11121314这样的
Program aa;
const
maxn=1000000000000000;
var
n,t:longint;
a:array[1..15] of char;
procedure dfs(l,sum,res,bl:int64);
var
i,j:longint;
begin
if l=n then
begin
res:=res+bl*sum;
if res=0 then
begin
inc(t);
if t<=20 then
begin
for i:=1 to n-1 do write(i,' ',a[i],' ');
writeln(n);
end;
end;
exit;
end;
a[l]:='+';
dfs(l+1,l+1,res+bl*sum,1);
a[l]:='-';
dfs(l+1,l+1,res+bl*sum,-1);
a[l]:='.';
if sum<=maxn then
if l+1<=9 then
dfs(l+1,sum*10+(l+1),res,bl)
else
dfs(l+1,sum*100+(l+1),res,bl);
end;
begin
{ assign(output,'a.pas');
rewrite(output);
}
read(n);
t:=0;
dfs(1,1,0,1);
writeln(t);
// close(output);
end.
本文介绍了一个用于解决特定数学问题的递归算法,该算法能够在指定的位数范围内寻找所有可能使得从1开始的连续数字串通过加减运算等于0的组合。文章详细展示了如何设定最大位数避免溢出,并提供了完整的Pascal语言实现代码。
130

被折叠的 条评论
为什么被折叠?



