pascal整数对问题考虑一个整数A(首位不为零),去掉它的任意一个数字后得到整数B(首位可能为零),给出A与B的和N(10
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/09 10:47:54
pascal整数对问题考虑一个整数A(首位不为零),去掉它的任意一个数字后得到整数B(首位可能为零),给出A与B的和N(10
pascal整数对问题
考虑一个整数A(首位不为零),去掉它的任意一个数字后得到整数B(首位可能为零),给出A与B的和N(10
pascal整数对问题考虑一个整数A(首位不为零),去掉它的任意一个数字后得到整数B(首位可能为零),给出A与B的和N(10
开个数组a[1..9999+999],清零.
枚举1-9999,然后找出分别去掉一个数字所有可能的值(如2006就是6、206、200),然后与元素相加(2006就是2012、2212、2206),然后以这些数做下标的a数组中的元素分别加一(2006就是inc(a[2012]),inc(a[2212]),inc(a[2206)).
然后每读一个数,输出以它为下标的a数组元素的值(比如读入34,输出a[34])
然后直到eof(input)结束.
var z:array[0..9999+999]of integer;
a,b,c,d,tp,e,f,g,h:integer;
begin
fillchar(z,sizeof(z),0);
for a:=0 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
if (a+b+c)>0 then begin
tp:=a*1000+b*100+c*10+d;
e:=a*100+b*10+c;
inc(z[e+tp]);
f:=a*100+b*10+d;
if e<>f then inc(z[f+tp]);
if a+b>0 then begin
g:=a*100+c*10+d;
if (g<>f) and (g<>e) then inc(z[g+tp]);
if a>0 then begin
h:=b*100+c*10+d;
if (h<>e) and (h<>f) and (h<>g) then inc(z[h+tp]);
end;
end;
end;
inc(z[10000]);
while not eof(input) do begin
readln(a);
writeln(z[a]);
end;
end.
判断重复上的方法比较笨拙,不过论数据规模,这个程序不会超时.
本程序在FP2.0下调试通过,TP7下也能用.
看不懂,再详细一点!