完全数等于其所有真因子的和,完全数又称完美数或完备数。
三个概念:亏数,完全数,盈数
当一个自然数的所有真因子的和小于该自然数,那么该自然数便是亏数。
当一个自然数的所有真因子的和大于该自然数,那么该自然数便是盈数。
当一个自然数的所有真因子的和等于该自然数,那么该自然数便是完全数。
比如
6=1+2+3 是完全数
28=1+2+4+7+14是完全数
496=1+2+4+8+16+31+62+124+248 是完全数
而1+2<4 是亏数。
1+2+3+4+6>12是盈数
等等
性质:
1.每一个完美数都可以表示成连续自然数的和。
6=1+2+3
28=1+2+3+4+5+6+7
496=1+2+3+...+30+31
2.每一个完全数都是调和数
如果一个正整数的所有因子的调和平均是整数,那么这个正整数便是调和数。而每一个完全数都是调和数。
比如6:1/1+1/2+1/3+1/6=2
28:1/1+1/2+1/4+1/7+1/14+1/28=2
3.每一个完全数都可以表示为2的一些连续正整数次幂之和
比如:
6=2^1+2^2
28=2^2+2^3+2^4
4.已知的完全数都是以6或8结尾
如
6,28,496,8128,33550336,
5.除6外的完全数都可以表示成连续奇次方之和
比如:28=1^3+3^3
296=1^3+3^3+5^3+7^3
具体实现如下:
#include <iostream>
#include <cmath>
using namespace std;
void perfect(long );
int main()
{
long length;
length = 10000;
cout<<length<<"范围内的完全数:"<<endl;
perfect(length);
system("pause");
return 0;
}
void perfect(long n)
{
long p[100];
long i,j,k,sum,num,count;
for (i = 1; i < n; i++)
{
num = i;
count = 0;
sum = num;
for (j = 1; j < num; j++)
{
if (num%j == 0)
{
p[count++] = j;
sum = sum - j;
}
}
if (sum == 0)
{
cout<<num<<"是一个完全数,因子为:";
cout<<num<<" = "<<p[0];
for (k = 1;k < count; k++)
{
cout<<" + "<<p[k];
}
cout<<endl;
}
}
}
结果如下: