各位c语言大神进来看看!
以下是求3000以内亲密数的代码,第一个代码无法运行,第二个代码可以正常编译,他俩的区别就在于第一个是在for循环外面赋值的,按常理来说不是应该在for循环外面赋值更好么?为啥反而编译不了了??{:5_104:}#include<stdio.h>
int main()
{
int a,i,b=0,n=0;
printf("下面是3000以内的亲密数:\n");
for(a=1;a<3000;a++)
{
for(i=1;i<=a/2;i++)
if(!(a%i))
b+=i;
for(i=1;i<=b/2;i++)
if(!(b%i))
n+=i;
if(n==a && a<b)
printf("%4d %4d ",a,b);
}
}
***************************
#include<stdio.h>
int main()
{
int a,i,b,n;
printf("下面是3000以内的亲密数:\n");
for(a=1;a<=3000;a++)
{
for(b=0,i=1;i<=a/2;i++)
if((a%i==0))
b+=i;
for(n=0,i=1;i<=b/2;i++)
if(!(b%i))
n+=i;
if(n==a &&a <b)
printf(" %4d %4d ",a,b);
}
} 因为最外层循环,也就是对每一个 a 进行计算时,都需要重置 b 和 n 为0。内层for循环要是只运行一次,那可以放到外面赋值,但是外面套了一层循环,运行不止一次,当然每次就需要重置一下 b 、 n {:10_266:}{:10_266:}{:10_266:}{:10_266:} 第一个代码
b = 0 只执行一次(在外面执行),所以 b 值会随着循环越变越大
第二个代码
b = 0 执行至少 3000 次,每次 a 循环,b 又变回 0 本帖最后由 jhq999 于 2022-6-5 19:35 编辑
楼上已经回答了你的代码我给你优化一下#include<stdio.h>
int main()
{
int a,i,b,n,m;
printf("下面是3000以内的亲密数:\n");
for(a=1;a<=300000;a++)
{
m=a/2;
for(b=0,i=1;i<m;i++)
{
m=a/i;
if((a%i==0))b+=i+m;
}
b-=a;
m=b/2;
for(n=0,i=1;i<m;i++)
{
m=b/i;
if(!(b%i))n+=i+m;
}
n-=b;
if(n==a &&a <b)
printf(" %4d %4d ",a,b);
}
}
页:
[1]