用pascal求2到1000的亲密数对program zlx;varn1,n2,a,b,s1,s2:integer;beginwriteln;for n1:=2 to 1000 dobegins1:=0;for a:=1 to n1-1 doif n1 mod a=0 thenbegins1:=s1+a;for n2:=2 to 1000 dobegins2:=0;for b:=1 to n2-1 doif n2 mod b=0 thenbegins2:=s2+b
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/25 14:48:10
用pascal求2到1000的亲密数对program zlx;varn1,n2,a,b,s1,s2:integer;beginwriteln;for n1:=2 to 1000 dobegins1:=0;for a:=1 to n1-1 doif n1 mod a=0 thenbegins1:=s1+a;for n2:=2 to 1000 dobegins2:=0;for b:=1 to n2-1 doif n2 mod b=0 thenbegins2:=s2+b
用pascal求2到1000的亲密数对
program zlx;
var
n1,n2,a,b,s1,s2:integer;
begin
writeln;
for n1:=2 to 1000 do
begin
s1:=0;
for a:=1 to n1-1 do
if n1 mod a=0 then
begin
s1:=s1+a;
for n2:=2 to 1000 do
begin
s2:=0;
for b:=1 to n2-1 do
if n2 mod b=0 then
begin
s2:=s2+b;
if (s1=n2) and (s2=n1) and (n1
用pascal求2到1000的亲密数对program zlx;varn1,n2,a,b,s1,s2:integer;beginwriteln;for n1:=2 to 1000 dobegins1:=0;for a:=1 to n1-1 doif n1 mod a=0 thenbegins1:=s1+a;for n2:=2 to 1000 dobegins2:=0;for b:=1 to n2-1 doif n2 mod b=0 thenbegins2:=s2+b
不得不问一句:LZ到底想干嘛?
这样编程,岂止是很费时间?太麻烦了!
先说一下你的问题:
你的代码的问题,首先在于很麻烦,看起来不容易找出错误,只要找出错误,就好理解了.
外层循环 n1 枚举第一个数,内层循环 s1 累加 n1 的所有因数,再内层 n2 枚举第二个数,再再内层 s2 累加 n2 的所有因数.但是,在 s1和s2 都还没有累加完时,怎么就相互比较了呢?!
我们可以模拟一下,当 n1 循环到408时,我自己计算出它的所有因数和确实是672:
672=1+2+3+4+6+8+12+17+24+34+51+68+102+136+204=s1
然后672的所有因数是:
1 2 3 4 6 7 8 12 14 16 21 24 28 32 42 48 56 84 96 112 168 224 336
加起来是1344,确实不等于408,但是,我们将上面的数从左往右加起来,
1+2+3+4+6+7+8+12+14+16+21+24+28+32+42+48+56+84+……加到这里,发现正好得到408,于是由于程序的bug,“408 672” 就被输出了.
其实由于数据量不大,枚举是可以解决问题的,代码如下:
var a:array[2..1000]of integer;
i,j:integer;
begin
for i:=2 to 1000 do
for j:=1 to i-1 do
if i mod j=0 then
inc(a[i],j);
for i:=2 to 500 do
if (i=a[a[i]])and(i<a[i]) then writeln(i,' ',a[i]);
end.