Kafka 基礎概念及架構
阿新 • • 發佈:2022-05-15
P1217 [USACO1.5]迴文質數 Prime Palindromes
題目描述
因為 151 既是一個質數又是一個迴文數(從左到右和從右到左是看一樣的),所以 151 是迴文質數。
寫一個程式來找出範圍 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一億)間的所有迴文質數。
輸入格式
第 1 行: 二個整數 a 和 b .
輸出格式
輸出一個迴文質數的列表,一行一個。
輸入輸出樣例
輸入 #15 500輸出 #1
5 7 11 101 131 151 181 191 313 353 373 383
超時未通過的第一種程式碼:
#include <iostream> #include <cmath> using namespace std; bool Prime(int x) { if(x<=1) return false; for(int i=2;i<=sqrt(x);i++) { if(x%i==0) return false; } return true; } bool Palindromes(int x) { int n,m; m=0;n=x; while(n!=0) { m=m*10+n%10; n/=10; } if(m==x) return true; else return false; } int main() { int a,b; cin>>a>>b; for(int i=a;i<=b;i++) { if(Prime(i)&&Palindromes(i)) cout<<i<<endl; } return 0; }
提交結果:
因為第一種程式碼在a~b中找質數,又在a~b中找回文數,所以迴圈的次數增加,也就導致了上面的執行結果不通過(不通過是因為超時)。
對於上面的程式碼,我們可以進行優化:1.質數從a~b裡找,迴文數在質數裡找;2.迴文數從a~b裡找,質數在迴文數裡找。
如果在質數裡找回文數程式碼是:
#include <iostream> #include <cmath> using namespace std; bool Palindromes(int x) { int n,m; m=0;n=x; while(n!=0) { m=m*10+n%10; n/=10; } if(m==x) return true; else return false; } bool Prime(int x) { if(x<=1) return false; for(int i=2;i<=sqrt(x);i++) { if(x%i==0) return false; } Palindromes(x); } int main() { int a,b; scanf("%d %d",&a,&b); if(b>=9999999) b=9999999; //最大的迴文質數處理 if(a%2==0)a++;//從2的倍數+1開始搜尋 for(int i=a;i<=b;i++) { if(Prime(i)) { if(Palindromes(i)!=0) cout<<i<<endl; } } return 0; }
提交結果:
為什麼在質數裡找回文數不通過呢?是因為找質數是用for迴圈1次1次的迴圈,迴圈次數就會很多
而找回文數用while迴圈次數就會少一些了,因為while迴圈的次數並不是1次1次的迴圈,所以要從迴文數裡找質數。
下面是通過的兩種程式碼:
通過的第一種程式碼:
#include <iostream> #include <cmath> using namespace std; bool Palindromes(int x) { int n,m; m=0;n=x; while(n!=0) { m=m*10+n%10; n/=10; } if(m==x) return true; else return false; } bool Prime(int x) { if(x<=1) return false; for(int i=2;i<=sqrt(x);i++) { if(x%i==0) return false; } Palindromes(x); } int main() { int a,b; scanf("%d %d",&a,&b); if(b>=9999999) b=9999999; //最大的迴文質數處理 if(a%2==0)a++;//從2的倍數+1開始搜尋 for(int i=a;i<=b;i++) { if(Palindromes(i)==0) continue; else if(Prime(i)) cout<<i<<endl; } return 0; }
通過的第二種程式碼:
#include<bits/stdc++.h> using namespace std; int a,b,s[10]; bool prime(int x)//判斷質數 { int i; for(i=3;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; } bool huiwen(int x)//判斷迴文 { int k,len=0,j; while(x!=0) { len++; s[len]=x%10; x/=10; } if(len==1) { s[len]=0; return 1; } for(k=1;k<=len/2;k++) if(s[k]!=s[len-k+1]) return 0; for(k=1;k<=len;k++) s[k]=0; return 1; } int main() { int i; cin>>a>>b; if(b>=9999999) b=9999999; //最大的迴文質數處理 if(a%2==0)a++;//從2的倍數+1開始搜尋 for(i=a;i<=b;i+=2)//2的倍數不為迴文質數 { if(huiwen(i)==0) continue; else if(prime(i)) cout<<i<<endl; } return 0; }
以上這兩種不同的解法,大家可以自行借鑑。