标题：完数
代码
C代码求1000以内的完数的C语言代码如下:
#include <stdio.h>
int main()
{
int n=1000;
int r,j,i;
for(i=1;i<n; i++){
r = 0;
for(j=1;j<i;j++){
if(i%j == 0){
r = r + j;
}
}
if(r == i){
printf("the result is:%d\n",r);
}
}
return 0;
}
the result is:6，28，496，
即1000以内的完数只有6、28、496三个数字。
用数组输出6——1000之间的完数及该完数所有因子的C代码如下：
#include<stdio.h>
void main()
{
int i,j,x,s,k;
int a[30];
for(x=6;x<=1000;x++)
{
s=0;j=0;
for(i=1;i<=x/2;i++)
if(x%i==0){s=s+i;a[j++]=i;}
if(s==x) 
{
printf("%d=",x);
for(k=0;k<j;k++)
printf("%d+",a[k]);
printf("\b \n");
}
}
}
结果：
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248C++代码求1000以内的完数的C++语言代码如下:
#include<iostream>
using namespace std;
int main()
{int n=1000;
int r=0,j,i;
for(i=1;i<=n;i++)
{r=0;
for(j=1;j<i;j++)
{if(i%j==0){r=r+j;}}
if(r==i)
{cout<<i<<endl;}}
return 0;
}JAVA代码用Java编写代码如下(只需修改N即可):
public static void main(String args[])
{
int i , j;
for(i=1;i<=1000;i++)
{     
int sum=0;
for(j=1,sum=0;j<=i/2;j++)
{        
if(i%j==0)
sum+=j;
}
if(sum==i)
System.out.println("完数："+i);
}
}C#代码static void Main(string[] args)
{
string result = "";
for (int i = 1; i < 1000; i++)
{
int temp = 0;
for (int j = 1; j < i; j++)
{
if (i % j == 0)
{
temp += j;
}
}
if (temp == i)
{
result += i.ToString() + " ";
}
}
Console.WriteLine("1000以内的完数有："+result);
Console.ReadKey();
}Pascal代码求N以内的完数的Pascal语言代码如下：
var            s,i,m,n:longint;
begin
readln(n);
for s:=1 to n do 
begin
m:=0;
for i:=1 to s-1 do
begin
if s mod i=0 then m:=m+i;
end;
if m=s then write(s);
end;
writeln('over');
end.
完数(Perfect number的形式
欧几里德证明了：一个偶数是完数，当且仅当它具有如下形式：2^(p-1)*(2^p-1) 
其中2^p-1是素数 
完全数（Perfect number）是一些特殊的自然数：它所有的真因子(即除了本身以外的约数 
)的和，恰好等于它本身。 
例如:第一个完全数是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，8128。 
古希腊数学家欧几里德是通过 2^(n-1)*(2^n-1) 的表达式发现头四个完全数的。 
当 n = 2^1*(2^2-1) = 6 
当 n = 2^2*(2^3-1) = 28 
当 n = 2^4*(2^5-1) = 496 
当 n = 2^6*(2^7-1) = 8128 
欧几里德证明了：一个偶数是完数，当且仅当它具有如下形式：2^(n-1)*(2^n -1)，而(2^n-1)必须是素数。 
尽管没有发现奇完数，但是当代数学家奥斯丁·欧尔（Oystein Ore）证明，若有奇完全 
数，则其形状必然是12p + 1或36p + 9的形式，其中p是素数。在1018以下的自然数中奇完数是不存在的。 
3
例子
6，28、496，8128，33550336，8589869056(10位)，1 3 7438691328(12位)， 
2305843008139952128(19位)…… 
偶完数都是以6或8结尾。如果以8结尾,那么就肯定是以28结尾。 
除6以外的偶完数，把它的各位数字相加,直到变成一位数,那么这个一位数一定是1（亦即 
：除6以外的完数，被9除都余1。）： 
28：2+8=10，1+0=1 
496：4+9+6=19，1+9=10，1+0=1 
所有的偶完数都可以表达为2的一些连续正整数次幂之和，从2p - 1到22p - 2: <注:以下a的n次方表示形式为a(n)>
6=2(1 ) + 2(2 )
28=2(2 ) + 2(3) + 2(4) 
496=2(4) + 2(5) + ... + 2(8)
8128=2(6) + 2(7) + 2(8)+... + 2(12) 
33550336=2(12) + 2(13 ) + 2(14)... + 2(24) 
每一个偶完数都可以写成连续自然数之和： 
6=1+2+3 
28=1+2+3+4+5+6+7； 
496=1+2+3+…+30+31 
除6以外的偶完数，还可以表示成连续奇数的立方和（被加的项共有)： 
28=1(3) + 3(3) 
496=1(3) + 3(3) + 5(3) + 7(3) 
8128=1(3 ) + 3(3) + 5(3) + ... + 15(3) 
33550336=1(3) + 3(3) + 5(3) + ... + 125(3) + 127(3) 
每一个完数的所有约数(包括本身)的倒数之和，都等于2： 
1/1 + 1/2 + 1/3 + 1/6 =2 
1/1 + 1/2 + 1/4 + 1/7 + 1/14 + 1/28 =2 
它们的二进制表达式也很有趣： 
(6)10 = (110)2 
(28)10 = (11100)2? 
====用VB编写代码如下=====
Dim i As Integer
Dim j As Integer
Dim intSum As Integer
For i = 1 To 1000
intSum = 0
For j = 1 To Int(i / 2)
If i Mod j = 0 Then intSum = intSum + j
Next j
If intSum = i Then Print i
Next i
====用PHP编写代码如下=====
求1000以内的完数的PHP语言代码如下:
for($i=1;$i<=1000;$i++)
{ $wannum=0;
for($j=1;$j<$i;$j++)
{if ($i%$j==0) 
{$wannum+=$j;}
}
if($wannum==$i)
echo $i."<br>";
}
==============================================java代码如下
public class WanShu {
public static void main(String[] args) {
int s;
for (int m = 1; m < 10000; m++) {
s = 0;
for (int i = 1; i < m; i++)
if (m % i == 0)
s = s + i;
if (s == m)
System.out.println(s);
}
}
}