日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

美素数(HDU 4548)(打表,简化时间复杂度)

發布時間:2024/4/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 美素数(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> using namespace std; const int Max=1000005; bool Mprime[Max]; int isprime(int a){int flag=1;for(int i=2;i*i<a;i++)if(a%i==0){flag=0;break;}return flag; } int add(int a){int flag=0,sum=0;while(a){sum+=a%10;a/=10;}if(isprime(sum)) flag=1;return flag; } int main() {int t,l,r;memset(Mprime,0,sizeof(Mprime));for(int i=2;i<Max;i++){ //注意1不是素數,要從二開始 if(add(i)&&isprime(i)) Mprime[i]=1;}scanf("%d",&t);for(int j=1;j<=t;j++){int sum=0;scanf("%d%d",&l,&r);for(int i=l;i<=r;i++){ //這里每輸入一組數據就要循環一次,如果每次輸入數據間隔很大必然超時if(Mprime[i]) sum++;}printf("Case #%d: %d\n",j,sum);} }

上代碼:

#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)(打表,简化时间复杂度)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。