1.如果給定乙個數n,要你計算小於n的素數的個數,如果n足夠大,那麼
素數的個數等價於x/ln(x);
**如下:
#include#include#includeusing namespace std;
/*這是判斷素數個數的位數
*/void pr(int n)
cout << static_cast(log10(k / log(k)))+1 << endl;
}void main()
2。哥德**猜想
哥德**猜想的意思是每乙個偶數都可以寫成一對素數之和。
我們可以以3為開頭,因為以2為開頭,2+3=5,2+5=7,2+素數不為偶數,進行判斷。
**如下
#include#include#includeusing namespace std;
/*歌德**猜想,我們假設第乙個數數是3,那麼排除偶數,我們每次加2
*/bool judge(int n)//判斷是否是素數
return 1;
}int pr(int n)
else
else
}return k; }}
void main()
} if (judge)
judge = true;
} //篩選
for (int i = k; i < n; i++)
}if (judge)
cout << i << endl;
judge = true; }}
void main()
4。6n+1法
任何乙個數都可以寫成6n+1 6n+2 6n+3 6n+4 6n+5 ,我們很容易就能知道
6n+1與6n+5必然是素數,那麼我們可以使用這種方法來判斷是否是素數。
**如下:
#include#includeusing namespace std;
/*6n+1法,如果最後餘數為1或者5,那麼可以判斷這是乙個素數
*/bool judge(int n)
else
return 0;
}void main()
5.分拆素數
把乙個偶數分解成不同的素數和
**如下:
#include#include#includeusing namespace std;
/*把偶數拆分成2個不同素數
與之前拆分**不同
這段**沒有之前的**好,時間複雜度提高了,主要是因為,我是從2開始,其實可以從3開始
以奇數判斷,可以使演算法更快。
*/bool judge(int n)
for (int i = 2; i <= k; i++)
return 1;
}int pr(int n)
int i = 2;
int j = n - i;
int k = 0;
while (i < j)
i += 1;
j = n - i;
} return k;
}void main()
6.素數距離
判斷m和n之間的素數的距離。
我們可以利用乙個陣列儲存這之間的素數,並且如果陣列的大小為1或者0,那麼
返回error
**如下:
#include#includeusing namespace std;
/*輸入兩個數 m和n 找出這兩個數之間素數差最小的數子,和最大的數
*/struct max
;struct min
;bool judge(int n)//可以使用6n+1法判斷更加快
if (n == 2)
int k = sqrt(n);
for (int i = 2; i <= k; i++) }
return 1;
}void pr(int m, int n)
else
}if (a.size() == 0||a.size()==1)
max my_max;
min my_min;
for (int i = 0; i < a.size()-1; i++)
if (key7.判斷n!的0的個數
判斷這個東西需要使用算數基本定理中的一種定理
n!中素數p的個數(冪)為
[n/p]+[n/p^2]+[n/p^3]+....
注意是計算機中預設的向下取整也就是4.5與4.9在計算機int中都是4,而向上取整則是5;
**如下
#include#includeusing namespace std;
/*計算n!末尾0的個數
由於我們計算的是n!所以我們可以知道2的因子個數
肯定大於5,而乙個2與乙個5,可以構成乙個0,所以我們是
求5的因子個數。
*/int pr(int n)
return sum;
}void main()
1.8 算數定理判斷乙個數的正因子的個數與所以因子的和
任何乙個正數可以寫成素數的積
n=p1^a1+p2^a2+...+pn^an;
設m為乙個正數的正因子的個數
m=(a1+1)*(a2+1)*...*(an+1);
設n為正因子的總數和
n=(p1^(a1+1)-1)/(p1-1)*...*(pn&(an+1)-1)/pn-1;
**如下:
#include#includeusing namespace std;
/*利用算數定理求正因子的個數
*/bool judge(int n)
if (n == 2)
int k = sqrt(n);
for (int i = 2; i <= k; i++) }
return 1;
}int pr(int n)
} int sum = 1;
int r = n;
int val = 0;
for (int i = 0; i < a.size(); i++)
sum *= (val + 1);
val = 0;
if (r == 1)//最後乙個素數因子
break;
} return sum;
}void main()
數論 素數測試
檢查乙個正整數是否是素數稱作素數測試。基本素數判別法 正整數n是素數,當且僅當它不能被任何乙個小於根號n的素數整除 埃拉託斯尼斯篩法 先把n個自然數按次序排列起來。1不是 質數,也不是 合數,要划去。第二個數2是 質數留下來,而把2後面所有能被2 整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下...
數論之 素數
素數又叫質數,乙個數除了1和他本身沒有其他因子的叫素數。最一般的判斷素數寫法 bool prime int x return true 快點的n開平方的複雜度bool prime int x 這是開平方的寫法,減小了查詢範圍。return true bool prime int x 這是乘的寫法,讓...
素數演算法總結
素數又叫質數 prime number 有無限個,只能能被1和自身整除的自然數.由於這句話,在我們求給定範圍n以內的素數的時候,我們通常採用的是下面這種演算法 include intmain void if flag printf d n i return 0 上面是非常低效的,低效的原因在於我們遍...