欧拉发现了一个计算完全数的公式:如果\( p \)是一个质数,并且\( 2^p - 1 \)也是质数,那么\( \frac{2^p - 1}{2^{p-1}} \)就是一个完全数。例如,当\( p = 2 \)时,\( 2^p - 1 = 3 \)也是质数,因此\( 3 \times 2 = 6 \)是完全数。当\( p = 3 \)时,\( 2^p - 1 = 7 \)也是质数,所以\( 7 \times 4 = 28 \)是完全数。当\( p = 5 \)时,\( 2^p - 1 = 31 \)也是质数,因此\( 31 \times 16 = 496 \)是完全数。但是,\( 2^p - 1 \)在什么条件下才是质数呢?实际上,当\( 2^p - 1 \)是质数时,我们称它为梅森素数。到2013年2月6日为止,人类只发现了48个梅森素数,其中包括3、7、31、127等较小的质数。
以下是几种编程语言的代码示例,用于寻找给定范围内的完全数:
1. **PASCAL程序**:判断\( A \)到\( B \)区域内的完全数。
```pascal
program wanquanshu;
var i,a,b:longint;
function wanquanshu(i:longint):boolean;
var sum,k:longint;
begin
sum:=1;
for k:= 2 to i div 2 do
if i mod k=0 then sum:=sum+k;
if i=sum then wanquanshu:= true
else wanquanshu:=false;
end;
begin
repeat
readln(a,b);
until (a>0) and (b>0) and (b>a);
for i:= a to b do
if wanquanshu(i) then writeln(i);
end.
```
2. **FreeBasic编程**:求\( n \)以内的完全数。
```freebasic
DIM AS INTEGER I,J,S
FOR I=1 TO 10000
S=0
FOR J=1 TO I\2
IF I MOD J=0 THEN S=S+J
NEXT J
IF S=I THEN PRINT I
NEXT I
SLEEP
```
3. **Pascal编程**:求\( n \)以内的完全数。
```pascal
program bill02;
var m,n,y,i,j,s,ss,z:longint;
a:array[1..10000] of integer;
begin
readln(m,n);
for i:=m to n do
begin
z:=0;
fillchar(a,sizeof(a),0);
s:=2;
ss:=1;
y:=i;
while y>0 do
begin
if y mod s=0 then
begin
ss:=ss+1;
a[ss]:=s;
y:=y div s;
end
else
s:=s+1;
end;
for j:=1 to ss do
z:=z+a[j];
if z=i then writeln(i);
end;
end.
```
4. **VB编程**:求10000以内的完全数。
```vb
Dim a as Integer,b as Integer,c as Integer
For a = 1 To 10000
c = 0
For b = 1 To a \ 2
If a Mod b = 0 Then c = c + b
Next b
If a = c Then Print Str(a)
Next a
```
5. **C语言**:求1000以内的完全数。
```c
#include
void main(){
int j,k,sum = 0;
for(k=2;k<=1000;k++){
sum=0;
for(j=1;j if(k%j==0) sum=sum+j; if(sum==k) printf("%d ",k); } } ``` 6. **Java语言**:求1000以内的完全数。 ```java public class PerfectNumber { public static void main(String[] args){ for(int i=2;i<1000;i++){ int sum=0; //查找因数 for(int j=1;j if(i % j==0){ sum += j; } if(sum==i) System.out.println(i); } } } } ``` 7. **C++语言**:求1000以内的完全数。 ```cpp #include using namespace std; int main () { int i,j,m; for(i=1;i<=1000;i++){ for(j=1,m=0;j while(i%j==0){ m=m+j; break; } } if(i==m){ cout< for(j=1;j while(m%j==0){ cout< break; } } cout< } } } ``` 8. **JavaScript语言**:求\( N \)以内的完全数。 ```javascript function perfectNumber(N){ var nums = [], sum, i, j; //0除以任意数都是0,所以从1开始 for (i = 1; i <= N; i++){ sum = 0; //完全数除以自己一半,求余肯定会大于0,所以用i/2 for(j = 1; j <= i/2; j++){ if (i % j === 0){ sum += j; } } if (sum === i){ nums.push(i); } } return nums; } ``` 9. **C#** ```csharp /*完美数推算*/ int 因子和 = 0; foreach (var 自然数 in Enumerable.Range(2, 10000)) { 因子和 = 0; foreach (var 真约数 in Enumerable.Range(1, 自然数 - 1)) if (自然数 % 真约数 == 0) 因子和 += 真约数; if (因子和 == 自然数) Console.WriteLine(自然数); } ``` 请注意,上述代码片段可能需要根据具体的编程环境进行调整以确保正确运行。