题干:一个数假如恰好等于他的因子之和,这个数就称为完数。例如6=1+2+3.编程找出1000以内的全部完数
本人是这样编的:
#include<stdio.h>
int main()
{
int a,i,b=0;
for(a=2;a<=1000;a++)
{
for(i=1;i<a;i++)
if(a%i==0)
b=b+i;
if(b==a)
{printf(“%d its factors are “,a);
for(i=1;i<a;i++)
if(a%i==0)
printf(“%d”,i);
printf(“\n”);}
}
return 0;
}
结果是Press any key to continue
但是假如把int b=0移到第一个for l里边
即
#include<stdio.h>
int main()
{
int a,i;
for(a=2;a<=1000;a++)
{ int b=0;
for(i=1;i<a;i++)
if(a%i==0)
b=b+i;
if(b==a)
{printf(“%d its factors are “,a);
for(i=1;i<a;i++)
if(a%i==0)
printf(“%d”,i);
printf(“\n”);}
}
return 0;
}
假如就对了,是
6 its factors are 123
28 its factors are 124714
496 its factors are 1248163162124248
Press any key to continue
为什么嫩?int b 的位置有啥影响
本人是这样编的:
#include<stdio.h>
int main()
{
int a,i,b=0;
for(a=2;a<=1000;a++)
{
for(i=1;i<a;i++)
if(a%i==0)
b=b+i;
if(b==a)
{printf(“%d its factors are “,a);
for(i=1;i<a;i++)
if(a%i==0)
printf(“%d”,i);
printf(“\n”);}
}
return 0;
}
结果是Press any key to continue
但是假如把int b=0移到第一个for l里边
即
#include<stdio.h>
int main()
{
int a,i;
for(a=2;a<=1000;a++)
{ int b=0;
for(i=1;i<a;i++)
if(a%i==0)
b=b+i;
if(b==a)
{printf(“%d its factors are “,a);
for(i=1;i<a;i++)
if(a%i==0)
printf(“%d”,i);
printf(“\n”);}
}
return 0;
}
假如就对了,是
6 its factors are 123
28 its factors are 124714
496 its factors are 1248163162124248
Press any key to continue
为什么嫩?int b 的位置有啥影响
解决方案
10
就是你每次第一个循环开始时都会初始化b = 0。
而原来的是一直累加。第一次循环没有输出后面原因是b值已经比较离谱了自然也没有输出了。
而原来的是一直累加。第一次循环没有输出后面原因是b值已经比较离谱了自然也没有输出了。
10
这问题确实有点儿可爱啊,哈哈
放进循环里就是每次循环都会初始化为0,放在循环外面就是一直累加
放进循环里就是每次循环都会初始化为0,放在循环外面就是一直累加
10
就是对b的初始化;
跟声明位置没关系;第一种情况,你只需第一次循环后对b初始化,第一种情况和第二种情况结果就一样了;
你不能把前一个数的求的和与后一个数的求的和放在一起;
跟声明位置没关系;第一种情况,你只需第一次循环后对b初始化,第一种情况和第二种情况结果就一样了;
你不能把前一个数的求的和与后一个数的求的和放在一起;
10
这个的话,是原因是b有没有初始化有关系。
当你把b放在循环里面,就会每次都被初始化为0;
当你把b放在循环外面的时候,就是一直累加,一直累加。
所以,假如说,你想要把这两个情况变得一样的话:
只需要把第一种情况下,在第一次循环后,对b初始化,就可以了;
这样子两种情况结果就一样了。