C语言:一个数如果恰好等于它的所有因子之和,这个数就称为“完数”。编写程序找出1000之内的所有完数
答案:2 悬赏:50 手机版
解决时间 2021-03-20 08:37
- 提问者网友:皆是孤独
- 2021-03-19 14:14
C语言:一个数如果恰好等于它的所有因子之和,这个数就称为“完数”。编写程序找出1000之内的所有完数
最佳答案
- 五星知识达人网友:孤老序
- 2021-03-19 14:31
for(j = 1;j < i;j++)
{
if(i % j == 0)
{
a[k] = j;
k++;
}
}
这个循环是用来找数i的因数j的。每次找到一个因数j,就存放在数组a[]中,下标就是k。
for(h = 0;h < k; h++)
{
s += a[h];
}
这个循环中,h相当于就是对数组a从0到k遍历相加。因为在上一个循环中,每次找到一个因数j,存放在数组a中后,k都做了++操作,所以k的值是在增加的,到最后跳出循环的时候,k的值就是数i的因数的个数了,也就是说数组a中有k个元素了。所以第三个循环时候h是从0开始,以小于k做结束条件的。追问到最后跳出循环的时候,k的值就是数i的因数的个数了,难道不可以用s+=a[k]吗,干嘛要多个h出来,我还是听不懂你的解释啊。能再详细点么?追答额,k是因数的个数。但是要注意,a[k]是数组下标越界的。你用s+=a[k]的目的,是想说在最外层循环作用下每次可以加一个a[k]嘛?那就完全不对了啊。最外层循环是从1,2,……1000每次一个数来验证这个数是不是完数。而完数的定义是这个数的所有因数之和等于该数,所以s的最终结果是数i的所有因数之和。数组a[]是用来存放每一轮的i的因数们的,一共有k个,分别是a[0],a[1],...a[k-1],而s = a[0] + a[1] + ... + a[k -1]。这个加法必须用循环来写,所以出现了h从0到k-1的循环。
{
if(i % j == 0)
{
a[k] = j;
k++;
}
}
这个循环是用来找数i的因数j的。每次找到一个因数j,就存放在数组a[]中,下标就是k。
for(h = 0;h < k; h++)
{
s += a[h];
}
这个循环中,h相当于就是对数组a从0到k遍历相加。因为在上一个循环中,每次找到一个因数j,存放在数组a中后,k都做了++操作,所以k的值是在增加的,到最后跳出循环的时候,k的值就是数i的因数的个数了,也就是说数组a中有k个元素了。所以第三个循环时候h是从0开始,以小于k做结束条件的。追问到最后跳出循环的时候,k的值就是数i的因数的个数了,难道不可以用s+=a[k]吗,干嘛要多个h出来,我还是听不懂你的解释啊。能再详细点么?追答额,k是因数的个数。但是要注意,a[k]是数组下标越界的。你用s+=a[k]的目的,是想说在最外层循环作用下每次可以加一个a[k]嘛?那就完全不对了啊。最外层循环是从1,2,……1000每次一个数来验证这个数是不是完数。而完数的定义是这个数的所有因数之和等于该数,所以s的最终结果是数i的所有因数之和。数组a[]是用来存放每一轮的i的因数们的,一共有k个,分别是a[0],a[1],...a[k-1],而s = a[0] + a[1] + ... + a[k -1]。这个加法必须用循环来写,所以出现了h从0到k-1的循环。
全部回答
- 1楼网友:撞了怀
- 2021-03-19 15:02
//看我给你改写的。
#include
int main()
{
int sum=0;
for(int i=1;i<=1000;i++) //循环在1-1000内进行
{
sum=0; //每次循环都先将sum初始化为0
for(int j=1;j
if(i%j==0) //如果j能被i整除,则j是i的因数
sum+=j; //就累加到sum中
if(sum==i) //如果和sum等于i这个值
{
printf("完全数有:%d=1",i); //则输出
for(j=2;j
if(i%j==0)
printf("+%d",j);
printf(" ");
}
}
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯