#include<stdio.h>
void main()
{
int i,j,k,h,s,sum
int a[200]//20个是不够的
s=0
sum=0
for(i=2i<=1000i++)
{
s=0//此处s=0一定要加,因为前几次循环的时候s的值已经改变
k=0
for(j=1j<ij++)
{
if((i%j)==0){a[k]=jk++}
}
for(h=0h<kh++)
{
s+=a[h]
}
if(i==s){printf("%d ",i)sum++}
}
printf("完数的个数:%d\n",sum)
}
一个数如果恰好等于除它本身外的因子之和,这个数就称为"完数",也叫“完美数”。例如6=1+2+3.(6的因子是1,2,3) [编辑本段]代码求1000以内的完数的C++语言代码如下:#include<iostream>
using namespace std
int main()
{int n=1000
int r=0,j,i
for(i=1i<=ni++)
{r=0
for(j=1j<ij++)
{if(i%j==0){r=r+j}}
if(r==i)
{cout<<i<<endl}}
return 0
}
求1000以内的完数的C语言代码如下:
#include <stdio.h>
int main()
{
int n=1000
int r,j,i
for(i=1i<ni++){
r = 0
for(j=1j<ij++){
if(i%j == 0){
r = r + j
}
}
if(r == i){
printf("the result is:%d\n",r)
}
}
return 0
}
输出结果为:
6,28,496,
即1000以内的完数只有6、28、496三个数字。
用Java编写代码如下(只需修改N即可):
{public static void main(String args[])
{intsum=0,i,j
for(i=1i<=1000i++)
{for(j=1,sum=0j<=i/2j++)
{if(i%j==0)
sum+=j
}
if(sum==i)
System.out.println("完数:"+i)
}
}
}
求N以内的完数的帕斯卡语言代码如下:
var s,i,m:qword
begin
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.
得出了第四个完数 8128
--------- 完数(Prefect 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位),137438691328(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 = 1m <10000m++) {
s = 0
for (int i = 1i <mi++)
if (m % i == 0)
s = s + i
if (s == m)
System.out.println(s)
}
}
}