素數相關習題

2021-10-23 20:46:25 字數 2197 閱讀 9549

素數定義:質數又稱素數。乙個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數(規定1既不是質數也不是合數)

判斷乙個數n是不是素數,最簡單的方法就是直接遍歷,看看從2到n-1是否能夠整除n。如下:

bool

isprime

(int n)

return

true

;}

因為如果能找到兩個因子相乘等於n的話,那麼這兩個數一定是位於sqrt(n)的兩邊的,所以我們只用判斷[2,sqrt(n)]之間是否有數能夠整除n即可,

bool

isprime

(int n)

return

true

;}

利用排除法,找到乙個素數,那麼該素數的倍數就應該都被排除。

#include

using

namespace std;

bool

isprime

(int n)

return

true;}

vector<

int>

findprime

(int n)

; vector<

int>

temp

(n+1);

for(

int i=

2;i<=n;i++

)else

} vector<

int> res;

for(

int i=

2;i1;i++

)return res;

}int

main()

system

("pause");

return0;

}

來自 猜數遊戲

牛牛和羊羊在玩乙個有趣的猜數遊戲。在這個遊戲中,牛牛玩家選擇乙個正整數,羊羊根據已給的提示猜這個數字。第i個提示是"y"或者"n",表示牛牛選擇的數是否是i的倍數。

例如,如果提示是"yynyy",它表示這個數使1,2,4,5的倍數,但不是3的倍數。

注意到一些提示會出現錯誤。

例如: 提示"nyyy"是錯誤的,因為所有的整數都是1的倍數,所以起始元素肯定不會是"n"。此外,例如"ynny"的提示也是錯誤的,因為結果不可能是4的倍數但不是2的倍數。

現在給出乙個整數n,表示已給的提示的長度。請計算出長度為n的合法的提示的個數。

例如 n = 5:

合法的提示有:

ynnnn ynnny ynynn ynyny yynnn yynny

yynyn yynyy yyynn yyyny yyyyn yyyyy

所以輸出12

輸入描述:

輸入包括乙個整數n(1 ≤ n ≤ 10^6),表示已給提示的長度。

輸出描述:

輸出乙個整數,表示合法的提示個數。因為答案可能會很大,所以輸出對於1000000007的模

示例1

輸入

5
輸出

12
思路:設dp[i]表示輸入長度為i時的合法的提示個數,那麼根據i的分類可能存在下面幾種情況:

因此,從上面分析中可以看出,長度為n的各位可以分為兩類:

所以,合法提示組合數問題轉化為求所有小於等於n的素數及他們的冪次數的組合數的乘積。也就是把每乙個素數和它的冪次歸為一類,求出每一類的合法提示組合數,由於類與類之間沒有重疊關係,因此總的組合數為所有類的組合數的乘積

#include

using

namespace std;

intmain()

//在n的範圍內,該素數的冪次最多為多大

long

long temp=i;

int count=0;

while

(temp<=n)

//計算所有素數冪次集合的乘積

res=res*

(count+1)

%1000000007;}

cout<

}return0;

}

習題 關於素數

1.判斷數n是否是素數 素數即質數,是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。反之則為合數。1既不是素數也不是合數。那麼根據定義,即可判斷乙個整數n是否為素數 bool isprime int n 這樣的時間複雜度為o n 我們考慮可不可以繼續化簡。考慮質數的性質 公理 合數...

素數相關問題

判斷素數 判斷乙個數是不是素數 最常用解法 sqrt n 1 int prime intn 2 13return1 14 15 找規律優化版,更快 1 int prime intn 2 14return1 15 16 篩選素數 判斷某個範圍內所有數是不是素數,或找出所有素數。其實用判斷素數迴圈一遍也...

素數相關演算法(二)

素數演算法 二 上次討論了簡單的素數判定的演算法,不過這個演算法對於位數較大 一般小於108 的素數判定就顯得相當力不從心了。比如在素數目前最廣泛的應用領域 公共金鑰體系中,一般選擇的素數都是相當大的 通常在100位以上 如果採用上次的試除法來判定,那麼可能要窮盡你一生的時間都還不夠。所以在一般的應...