USACO-Section1.6 Prime Palindromes(素数和回文数)
生活随笔
收集整理的這篇文章主要介紹了
USACO-Section1.6 Prime Palindromes(素数和回文数)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2017-8-3
題目描述
求出給定范圍內(nèi)的質(zhì)數(shù)回文數(shù)解答
先求出回文數(shù)再判斷是否為給定區(qū)間的質(zhì)數(shù)代碼
/* ID: 18795871 PROG: pprime LANG: C++ */ #include<iostream> #include<cmath> #include<fstream> using namespace std;ifstream fin("pprime.in"); ofstream fout("pprime.out");const int N = 1000; long x[N+1]; int cnt=0; long a,b;bool is_prime(long n){ //判斷是否為給定區(qū)間的質(zhì)數(shù)if (n<a||n>b){return false;}if (n==0||n==1) return false;if (n==2||n==3) return true;long i;for (i=2;i<=sqrt(n);i++){if (n%i==0) return false;}return true; }void hui_8(){ //八位回文數(shù) int x1,x2,x3,x4;for (x1=1;x1<=9;x1+=2){for (x2=0;x2<=9;x2++){for (x3=0;x3<=9;x3++){for (x4=0;x4<=9;x4++){ long n=(x1*1000+x2*100+x3*10+x4)*10000+x4*1000+x3*100+x2*10+x1;if (is_prime(n)) fout<<n<<endl;}}}} }void hui_7(){int x1,x2,x3,x4;for (x1=1;x1<=9;x1+=2){for (x2=0;x2<=9;x2++){for (x3=0;x3<=9;x3++){for (x4=0;x4<=9;x4++){long n=(x1*1000+x2*100+x3*10+x4)*1000+x3*100+x2*10+x1;if (is_prime(n)) fout<<n<<endl;}}}} }void hui_6(){int x1,x2,x3;for (x1=1;x1<=9;x1+=2){for (x2=0;x2<=9;x2++){for (x3=0;x3<=9;x3++){long n=(x1*100+x2*10+x3)*1000+x3*100+x2*10+x1;if (is_prime(n)) fout<<n<<endl;}}} }void hui_5(){int x1,x2,x3; for (x1=1;x1<=9;x1+=2){for (x2=0;x2<=9;x2++){for (x3=0;x3<=9;x3++){long n=(x1*100+x2*10+x3)*100+x2*10+x1;if (is_prime(n)) fout<<n<<endl;}}} }void hui_4(){int x1,x2;for (x1=1;x1<=9;x1+=2){for (x2=0;x2<=9;x2++){long n=(x1*10+x2)*100+x2*10+x1;if (is_prime(n)) fout<<n<<endl;}} }void hui_3(){int x1,x2;for (x1=1;x1<=9;x1+=2){for (x2=0;x2<=9;x2++){long n=(x1*10+x2)*10+x1;if (is_prime(n)) fout<<n<<endl;}} }void hui_2(){int x1;for (x1=1;x1<=9;x1+=2){long n=x1*10+x1;if (is_prime(n)) fout<<n<<endl;} }void hui_1(){for (int i=2;i<=9;i++){if (is_prime(i)) fout<<i<<endl;} }int main(){cnt=0;fin>>a>>b;hui_1();hui_2(); hui_3(); hui_4(); hui_5(); hui_6();hui_7(); hui_8();return 0; }1.回文數(shù)比較少,那么我們可以先判斷回文數(shù)再判斷素數(shù)
2.我們可以枚舉區(qū)間內(nèi)所有的數(shù),如果是回文數(shù)的話就再判斷是否為素數(shù),但是這個在第七個測試數(shù)據(jù)的時候就已經(jīng)超時了。
3.那么我們最后的選擇就是自己構(gòu)建回文數(shù)。
上面的是超時的代碼。。。
它給的提示是枚舉所有的回文數(shù)(不是暴力枚舉,而是自己構(gòu)建),然后再判斷即可,這里需要注意的是:我們可以在is_prime函數(shù)里面判斷是否在給定a到b區(qū)間內(nèi),這樣可以省去很多判斷。
/* ID: 18795871 PROG: pprime LANG: C++ */ #include<iostream> #include<fstream> #include<cstring> using namespace std;ifstream fin("pprime.in"); ofstream fout("pprime.out");typedef long long ll; const int N = 10; ll a,b; int i,j,k,t;bool isprime(ll n){if (n>b||n<a) return false; for (int i=2;i*i<=n;i++){if (n%i==0) return false;}return true; }void pal1(){for (i=1;i<N;i++){if (isprime(i)){fout<<i<<endl; }} }void pal2(){for (i=1;i<N;i++){if (isprime(i*10+i)){fout<<(i*10+i)<<endl; }} }void pal3(){for (i=1;i<N;i++){for (j=0;j<N;j++){if (isprime(i*100+j*10+i)){fout<<(i*100+j*10+i)<<endl; } }} }void pal4(){for (i=1;i<N;i++){for (j=0;j<N;j++){if (isprime((i*10+j)*100+j*10+i)){fout<<((i*10+j)*100+j*10+i)<<endl; } }} }void pal5(){for (i=1;i<N;i++){for (j=0;j<N;j++){for (k=0;k<N;k++){if (isprime((i*100+j*10+k)*100+j*10+i)){fout<<((i*100+j*10+k)*100+j*10+i)<<endl; } } }} }void pal6(){for (i=1;i<N;i++){for (j=0;j<N;j++){for (k=0;k<N;k++){if (isprime((i*100+j*10+k)*1000+k*100+j*10+i)){fout<<((i*100+j*10+k)*1000+k*100+j*10+i)<<endl; } } }} }void pal7(){for (i=1;i<N;i++){for (j=0;j<N;j++){for (k=0;k<N;k++){for (t=0;t<N;t++){if (isprime((i*1000+j*100+k*10+t)*1000+k*100+j*10+i)){fout<<((i*1000+j*100+k*10+t)*1000+k*100+j*10+i)<<endl; } } } }} }void pal8(){for (i=1;i<N;i++){for (j=0;j<N;j++){for (k=0;k<N;k++){for (t=0;t<N;t++){if (isprime((i*1000+j*100+k*10+t)*10000+t*1000+k*100+j*10+i)){fout<<((i*1000+j*100+k*10+t)*10000+t*1000+k*100+j*10+i)<<endl; } } } }} }int main(){while (fin>>a>>b){pal1();pal2();pal3();pal4();pal5();pal6();pal7();pal8();}return 0; }總結(jié)
以上是生活随笔為你收集整理的USACO-Section1.6 Prime Palindromes(素数和回文数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栈的C语言实现
- 下一篇: 冯诺依曼计算机的组成