编写函数输出完备数及其所有约数

2018-06-04  本文已影响0人  Go_for_Google

如果一个数正好是他的所有约数(除了它本身以外)的和,称为完备数,
如:6,它的约数有1,2,3,并且1+2+3=6.求出30000以内的所有完备数,并显示输出。
(求完备数用函数实现)(参考函数原型:void find(int j),直接在函数中输出小于等于j的完备数及其所有约数)
输入输出格式要求:
编写函数void find(int j);直接在函数中输出小于等于j的完备数及其所有约数
输出格式:
完备数=约数+约数+约数...回车
(约数从小到大)
例如:
find(40);
输出:
6=1+2+3回车
28=1+2+4+7+14回车

#include<stdio.h>
#include<stdlib.h>
void find(int m)
{
    int count;
    int i, j;
    for (i = 4; i <= m; i+=2)//迄今发现的完数都是偶数,所以只考察m内的偶数
    {
        for (count=1,j = 2; j*j <= i; j++)//用2、3、4……去除i,直到i的平方根
        {
            if (!(i%j))
                count += (j != i / j ? j + i / j : i);//若能整除则把由下一句把因子加到count上,count初值=1是因为1肯定是因子
        }
        if (count == i)
        {//当因子和count等于i时i就是完数,由以下语句输出因子和的表达式
            printf("%d=1", i);
            for ((count >>= 1) += 1, j = 2; j < count; j++)//用2、3、4……去除这个完数,直到它的一半,也可以用数组记录下每个因子,然后输出数组的每个元素
            {
                if (!(i%j))//若能整除,则j就是它的一个因子
                    printf("+%d", j);//将这个因子用+号连接输出
            }
            printf("\n");//结尾按照格式要求输入回车符
        }
    }
}
int main()
{
    int m;
    scanf_s("%d", &m);
    find(m);
    system("pause");
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读