素數定義:質數又稱素數。乙個大於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位以上 如果採用上次的試除法來判定,那麼可能要窮盡你一生的時間都還不夠。所以在一般的應...