數論演算法總結 素數

2021-09-29 01:10:37 字數 3280 閱讀 7889

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 上面是非常低效的,低效的原因在於我們遍...