用pascal求2到1000的亲密数对

问题描述:

用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
1个回答 分类:综合 2014-11-30

问题解答:

我来补答
不得不问一句: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.
再问: 请问下 for i:=2 to 500 do {这里为甚么从2到500呢} if (i=a[a[i]])and(i
 
 
展开全文阅读
剩余:2000
上一页:hfftbjhg