有三个,6、28、496。
第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。
第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
第三个完全数是496,有约数1、2、4、8、16、31、62、124、248、496,除去其本身496外,其余9个数相加,1+2+4+8+16+31+62+124+248=496。
推导公式:
大数学家欧拉曾推算出完全数的获得公式:如果p是质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数。
例如p=2,是一个质数,2^p-1=3也是质数,(2^p-1)X2^(p-1)=3X2=6,是完全数。
例如p=3,是一个质数,2^p-1=7也是质数,(2^p-1)X2^(p-1)=7X4=28,是完全数。
例如p=5,是一个质数,2^p-1=31也是质数,(2^p-1)X2^(p-1)=31X16=496是完全数。
#include <stdio.h>
void main()
{
int i,j;
printf("1000之内的所有完数:\n");
for(i=6;i<1000;i++){
int sum=0;
for(j=1;j<i;j++){
if(i%j==0)
sum = sum+j;
}
if(sum==i)printf("%d,",i);
}
}
输出结果为:6,28,496
原代码中的sum 初始化的位置是错误的,导致结果不正确,正确代码请看我的回答。
完数,一般指完全数,一个自然数如果它的所有真因子(即除了自身以外的约数)的和等于该数,那么这个数就是完全数,如:6的真因子有1 、2、3,6=1+2+3,所以6是一个完全数。
求1000以内的完数可以用C,C++、java和Pascal语言等,下面举例java语言实现代码。
用java编写1000以内的完数如下:
public class PerfectNumber { public static void main(String[] args) { System.out.println("1000以内的所有完数有:"); for (int i = 2; i < 1000; i++) {// 遍历1000以内的所有整数 int sum = 0;// 定义和变量 for (int j = 1; j < i; j++) { if (i % j == 0) {// 满足是i的因子,就累加 sum += j; } } if (sum == i) {// 满足因子之和等于i就打印该完数 System.out.print(i + " "); } } }}