用java或C語言找到10000000以內的完美數

2020-10-02 12:00:01

首先要知道完美數的計算公式,如果用迴圈來寫會超時的計算公式:如果2^p-1為素數,那麼(2^p-1)*(2^(p-1))為完美數,只需要去遍歷p就可以了10000000萬的話,遍歷到30就妥妥的夠了,注意結束條件不要因為相乘導致越界。下面是java和C語言實現的程式碼,語法相識,所以差不多。目前世界上已知的完美數為49個,整型範圍內只有5個,如果沒有其他方法可以打表輸出,下面是整型範圍內的5個完美數

6
28
496
8128
33550336

Java程式碼

package zhh_2;
import java.lang.Math;
public class wanMeiShu {
    static int Prime(int n) {
        if (n == 1)
            return 0;
        int k = (int)Math.sqrt(n);
        for (int i = 2; i <= k; i++)
            if (n % i == 0)
                return 0;
        return 1;
    }
    public static void main(String[] args) {
        for(int i=2;i<1000;i++){
            int k= (int) (Math.pow(2, i) - 1);
            if(Prime(k)==1){
                int x= (int) ( Math.pow(2, i - 1) * k);
                if(x<=10000000)
                    System.out.println(x);
                else break;
            }     
        }
    }
}

C語言程式碼

#include<stdio.h>
#include<math.h>
int Prime(int n) {
    if (n == 1)
        return 0;
    int k = (int)sqrt(n);
    for (int i = 2; i <= k; i++)
        if (n % i == 0)
            return 0;
    return 1;
}
int main()
{
	for(int i=2;i<1000;i++){
        int k= (int)(pow(2,i)-1);
        if(Prime(k)==1){
            int x= (int)(pow(2,i-1)*k);
            if(x<=10000000)
                printf("%d\n",x);
            else break;
        }     
    }
}