美素数(HDU 4548)(打表,简化时间复杂度)
生活随笔
收集整理的這篇文章主要介紹了
美素数(HDU 4548)(打表,简化时间复杂度)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相信大家都喜歡美的東西,讓我們一起來看看美素數吧。
問題是這樣的:一個十進制數,如果是素數,而且它的各位數字和也是素數,則稱之為“美素數”,如29,本身是素數,而且2+9 = 11也是素數,所以它是美素數。
給定一個區間,你能計算出這個區間內有多少個美素數嗎?Input 第一行輸入一個正整數T,表示總共有T組數據(T <= 10000)。
接下來共T行,每行輸入兩個整數L,R(1<= L <= R <= 1000000),表示區間的左值和右值。 Output 對于每組數據,先輸出Case數,然后輸出區間內美素數的個數(包括端點值L,R)。
每組數據占一行,具體輸出格式參見樣例。 Sample Input 3 1 100 2 2 3 19 Sample Output Case #1: 14 Case #2: 1 Case #3: 4
思路應該是很清晰的:十進制數是素數、它的各位數字和也是素數,這兩個一判斷就OK了。
但是因為數據很多還是會出現很多問題的,比如說超時,這時就需要我們打表了。
這里不要想著用篩法求素數,容易超時。
這是最開始的代碼,一直超時
上代碼:
#include<cstdio> #include<cstring> #include<cmath> const int Max=1000005; int sum[Max],p[Max]; //sum[i]存儲比i小的素數的個數 int isprime(int a){for(int i=2;i<=sqrt(a);i++) //sqrt很重要,如果不用結果會不正確,因為如果用i*i可能會溢出if(a%i==0) return 0;return 1; } int add(int a){int sum=0;while(a){sum+=a%10;a/=10;}if(isprime(sum)) return 1;return 0; } int main() {int t,l,r;?? ?for(int i=2;i<Max;i++){ //注意1不是素數,要從二開始 if(add(i)&&isprime(i))p[i]=1;sum[i]=sum[i-1]+p[i]; //先填充數組p,在填充數組sum,即用兩個循環也不會超時}scanf("%d",&t);for(int j=1;j<=t;j++){scanf("%d%d",&l,&r);printf("Case #%d: %d\n",j,sum[r]-sum[l-1]); //一定是l-1,不然就把l去掉了} }轉載于:https://www.cnblogs.com/RenoStudio/p/10355228.html
總結
以上是生活随笔為你收集整理的美素数(HDU 4548)(打表,简化时间复杂度)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.Django与Ajax
- 下一篇: ashx 绝对路径得到物理路径