A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一个数如果恰好等于它的因子之和,这个数就称为完数,如:6=1+2+3,编程找出1000以内的所有完数

8 个回复

倒序浏览
本帖最后由 huzhiqiang 于 2016-5-19 23:05 编辑

这是我自己刚刚写的,我自己没有答案,结果只有3个数,不知道对不对,但我自己觉得是可以的,你有没有答案哦
#include <stdio.h>

int main(int argc, const char * argv[])
{

    for(int i = 1;i<1000;i++)
    {
        int sum=0;//sum用于存放因子之和
        for(int j=1;j<i;j++)
        {
            if(i%j==0)//找到除了i自身以外的因子
            {
                if(j*j==i)//如果俩因子相等,因子乘以2加入到sum中
                    sum=sum+2*j;
                else
                    sum+=j;

            }
        }
        if(sum==i)//如果因子等于这个数,那么这个数就是完数,输出完数
            printf("%d\n",i);

    }

    return 0;
}


回复 使用道具 举报
huzhiqiang 发表于 2016-5-19 23:02
这是我自己刚刚写的,我自己没有答案,结果只有3个数,不知道对不对,但我自己觉得是可以的,你有没有答案 ...

int sum=0;//sum用于存放因子之和

这一步的原理是什么?
谢谢
回复 使用道具 举报
牛牛很牛 发表于 2016-5-22 21:10
int sum=0;//sum用于存放因子之和

这一步的原理是什么?

1.因为后面要把所有因子的和和这个数本身作比较,所以就先定义一个sum来存放因子之和。
2.外部的for循环每循环一次就可以得到一个i的值,保证可以把1000以内的所有整数都遍历一次,而内部的for循环的循环条件是j<i,目的是为了让i能对小于i的数都取一次余数,如果取到的余数为0,那么这时的j的大小就是当时的i的值一个因子
3 然后再将得到的所有因子加起来就可以,因为是在循环体内,所以把每一次得到的因子都加到一个数上(这个数就是sum,就像挑水一样,把每次挑回来的水都倒进水缸里一样)
4.关于后面的
if(j*j==i)//如果俩因子相等,因子乘以2加入到sum中
       sum=sum+2*j;
之所以sum=sum+2*j,是因为比如25这样的数,有两个因子都是5这种情况,但是循环的时候,只会对5取一次余数,所以就要加上2*j

不知道讲得清楚不,呵呵
回复 使用道具 举报
牛牛很牛 发表于 2016-5-22 21:10
int sum=0;//sum用于存放因子之和

这一步的原理是什么?

1.因为后面要把所有因子的和和这个数本身作比较,所以就先定义一个sum来存放因子之和。
2.外部的for循环每循环一次就可以得到一个i的值,保证可以把1000以内的所有整数都遍历一次,而内部的for循环的循环条件是j<i,目的是为了让i能对小于i的数都取一次余数,如果取到的余数为0,那么这时的j的大小就是当时的i的值一个因子
3 然后再将得到的所有因子加起来就可以,因为是在循环体内,所以把每一次得到的因子都加到一个数上(这个数就是sum,就像挑水一样,把每次挑回来的水都倒进水缸里一样)
4.关于后面的
if(j*j==i)//如果俩因子相等,因子乘以2加入到sum中
       sum=sum+2*j;
之所以sum=sum+2*j,是因为比如25这样的数,有两个因子都是5这种情况,但是循环的时候,只会对5取一次余数,所以就要加上2*j

不知道讲得清楚不,呵呵
回复 使用道具 举报
本帖最后由 牛牛很牛 于 2016-5-22 22:27 编辑

代码整体都明白了。
我提问的时候是一直没弄明白 sum=0 定义在循环内部不是一遍一遍让sum等于零吗?对结果不会有影响吗?看了你的回答我的理解是因为循环一直不停(在1000以内),所以每次找到一个 i 还会继续找下一个新的 i ,虽然sum等于0了,但是 j 没有,j还在继续累加,对sum重新赋值。
表述逻辑比较啰嗦,呵呵。不知道我理解的对吗?
再次深表感谢!!
回复 使用道具 举报
huzhiqiang 发表于 2016-5-22 21:47
1.因为后面要把所有因子的和和这个数本身作比较,所以就先定义一个sum来存放因子之和。
2.外部的for循环 ...

代码整体都明白了。
我提问的时候是一直没弄明白 sum=0 定义在循环内部不是一遍一遍让sum等于零吗?对结果不会有影响吗?
看了你的回答我的理解是因为循环一直不停(在1000以内),所以每次找到一个 i 还会继续找下一个新的 i ,虽然sum等于0了,但是j没有,j还在继续累加,对sum重新赋值。
表述逻辑比较啰嗦,呵呵。不知道我理解的对吗?
再次深表感谢!!
回复 使用道具 举报
牛牛很牛 发表于 2016-5-22 22:26
代码整体都明白了。
我提问的时候是一直没弄明白 sum=0 定义在循环内部不是一遍一遍让sum等于零吗?对结 ...

是的,就是这样,呵呵
回复 使用道具 举报
huzhiqiang 发表于 2016-5-22 22:33
是的,就是这样,呵呵

tks!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马