[6,n]中的素數之和為偶數的打印出來
阿新 • • 發佈:2019-01-03
題目就這麼簡單。
本題首先是求素數可以進行優化,採用之前的素數篩選法先把[6,N]中的素數找出來,但是有一個問題,必須從頭開始篩選
【6,n】中的素數都是奇數,其實所有的素數中,只有2是偶數,[6,n]中的所有素數的和就是偶數,採用遍歷的方法就可以把偶數找出來,演算法複雜度為o(n2)
解法1:
解法2:#include<iostream> #include<string.h> using namespace std; int main() { int n; int count = 0; int i; int j; int sum; cout<<"enter N(N>=6) = "; cin>>n; //build array int *array = new int[n+1]; int *save = new int[n+1]; //initialize the array //memset only used for char /*memset(array,0x1,sizeof(array));*/ //Screening of prime Numbers for(i = 2;i <= n;i++) array[i] = 1; for(i = 2;i <= n;i++) { if(array[i] == 1) { //j is used for counting for(j = i;j <= n/i;j++) { array[i*j] = 0; } } } cout<<"the prime numer is follows:"<<endl; for(i = 6;i <= n;i++) { if(array[i] == 1) { printf("%-4d ",i); save[count] = i; count++; } } cout<<"\n"<<endl; //print even numbers: cout<<count<<" even numbers are follows:"<<endl; delete array; array = new int[n+n+1]; for(i = 2;i <= n+n;i++) array[i] = 0; //可能會有重複的數,要進行篩選 //對重複的數字可以用雜湊,但是如果數字太大反而需要太多額外空間的開銷 得不償失 for(i = 0;i <count-1;i++) { for(j = i+1;j < count;j++) { sum = save[i]+save[j]; array[sum] = 1; } } for(i = 6+6;i <= n+n;i++) { if(array[i] == 1) cout<<i<<" "; } cout<<endl; }
記得數學上有這樣一個猜想:哥德巴赫猜想
所以可以從偶數入手,先找出偶數的兩個素數,判斷素數有沒有在給定的範圍內
(待實現)