如果一个数正好是他的所有约数(除了它本身以外)的和,称为完备数,
如: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;
}