因子完备数c语言,编写函数输出完备数及其所有约数

如果一个数正好是他的所有约数(除了它本身以外)的和,称为完备数,

如: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

#include

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;

}