C语言:一个数如果恰好等于它的所有因子之和,这个数就称为“完数”。编写程序找出1000之内的所有完数

我在网上查到的代码如下:#include<stdio.h>voidmain(){inti,j,k,h,s,sum;inta[1000];sum=0;for(i=2;i<=... 我在网上查到的代码如下:
#include<stdio.h>
void main()
{
int i,j,k,h,s,sum;
int a[1000];
sum = 0;

for(i = 2; i <= 1000; i++)
{
s = 0;
k = 0;
for(j = 1;j < i;j++)
{
if(i % j == 0)
{
a[k] = j;
k++;
}
}
for(h = 0;h < k; h++)
{
s += a[h];
}
if(i == s)
{
printf("%d ", i);
sum++;
}
}
printf("完数的个数:%d\n", sum);
}

我搞不懂第三个for循环,我找不出h和k究竟有什么联系。
还有下面是我自己编的,看了网上的正确的版本之后我搞不懂我运行自己编的代码之后为什么会出现"press any key to continue"?
展开
 我来答
小夏聊生活
高能答主

2019-12-11 · 专注于分享生活知识,热爱生活
小夏聊生活
采纳数:447 获赞数:114596

向TA提问 私信TA
展开全部

源代码如下:

#include <stdio.h>

main()

{

int i,j;

int sum;

for(i=1;i<=1000;i++)

{

sum=0;

 for(j=1;j<i;j++)

 {

if(i%j==0)

sum+=j;

}

 if(sum==i)

 {

printf("%d its factors are ",i);

for(j=1;j<i;j++)

 if(i%j==0)

printf("%d ",j);

 }

 printf("\n");

}

扩展资料

1、完全数是一些特殊的自然数,它所有的真因子即除了自身以外的约数的和即因子函数,恰好等于它本身。

2、第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28。

3、有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4 + 7 + 14=28。后面的数是496、8128。

乐VoV乐
2013-03-01 · 知道合伙人软件行家
乐VoV乐
知道合伙人软件行家
采纳数:289 获赞数:877
深圳市潮范文化传播有限公司软件工程师.

向TA提问 私信TA
展开全部

//看我给你改写的。

#include<stdio.h>

int main()

{

int sum=0;

for(int i=1;i<=1000;i++)   //循环在1-1000内进行

{

sum=0;         //每次循环都先将sum初始化为0

for(int j=1;j<i;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<i;j++)

if(i%j==0)

printf("+%d",j);

printf("\n");

}

}

return 0;

}


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
用户阿杰
2012-12-16
知道答主
回答量:42
采纳率:0%
帮助的人:27.4万
展开全部
#include<stdio.h>
#include<stdlib.h>
void main(){
int x,y,i,sum,h;
int *a;
printf("1000以内的所有完整数:\n");
for(i=1;i<=1000;i++) {
sum = 1;
a = (int *)malloc (i*sizeof(int));
a[0]=1;
for(x=2,h=1;x<i;x++){
y=i%x;
if(y==0){
a[h] = x;
sum+=x;
h++;
}
}
if(sum==i) {
printf("%d its factors are ",i);
for(x=0;x<h-1;x++)
printf("%d,",a[x]);
printf("%d\n",a[x]);
}
free(a);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
灰晞郁
推荐于2017-11-25 · TA获得超过103个赞
知道答主
回答量:43
采纳率:0%
帮助的人:49.5万
展开全部
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的循环。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式