OpenJudge NOI 1.13 11:回文素数
【題目鏈接】
OpenJudge NOI 1.13 11:回文素?cái)?shù)
【題目考點(diǎn)】
1. 函數(shù)
2. 質(zhì)數(shù)
3. 回文數(shù)
【解題思路】
輸入的數(shù)字n可以達(dá)到9位數(shù)字,枚舉判斷每個數(shù)字是否是回文數(shù)與質(zhì)數(shù),復(fù)雜度會過高。
可以先構(gòu)造出n位數(shù)字所有可能的回文數(shù),以下有兩種構(gòu)造回文數(shù)字的方法:
方法1:對于一個任意的x位數(shù)字,將x的倒序數(shù)字接在原數(shù)字x的后面,就可以構(gòu)造出一個2x位的回文數(shù)。
例:數(shù)字123可以構(gòu)造出123321。數(shù)字56可以構(gòu)造出5665
方法2:將x的倒序數(shù)字接在原數(shù)字x的后面,并重合一位數(shù)字,就可以構(gòu)造出一個2x-1位的回文數(shù)。
例:數(shù)字123可以構(gòu)造出12321。數(shù)字56可以構(gòu)造出565
反過來想,一個n位的回文數(shù)字,
如果n是偶數(shù),那么遍歷所有n2\frac{n}{2}2n?位的整數(shù),用方法1可以構(gòu)造出所有n位的回文數(shù)。
如果n是奇數(shù),那么遍歷所有n+12\frac{n+1}{2}2n+1?位的整數(shù),用方法2可以構(gòu)造出所有n位的回文數(shù)。
構(gòu)造出所有n位數(shù)字的回文數(shù),依次判斷每個回文數(shù)字是否是質(zhì)數(shù),如果是,則將數(shù)字填充到數(shù)組中。
最后輸出數(shù)組長度及數(shù)組的內(nèi)容。(這一步可以使用vector)
【題解代碼】
解法1:填充數(shù)組
#include<bits/stdc++.h> using namespace std; #define N 100005 int rev(int x)//得到x的逆序數(shù)字 {int num = 0;//y:x的逆序數(shù)字 for(int a = x; a > 0; a /= 10)num = num*10+a%10;return num; } bool isPrime(int n)//判斷n是否是質(zhì)數(shù) {if(n < 2)return false;for(int i = 2; i <= sqrt(n); ++i){if(n%i == 0)return false;}return true; } int main() {int n, d, x, y, num, mi, mx;//d:用于構(gòu)造回文數(shù)的原數(shù)字位數(shù) int a[N], ai = 0;//a:保存既是回文數(shù)又是質(zhì)數(shù)的數(shù)字 ai:數(shù)字個數(shù) cin >> n;if(n%2 == 0)d = n/2;elsed = (n+1)/2;mi = pow(10, d-1);//d位數(shù)最小值,為10^{d-1}mx = 10*mi;//d位數(shù)最大值+1,為10^d for(x = mi; x < mx; ++x)//x:用于構(gòu)造回文數(shù)的原數(shù)字 {y = rev(x);//y:x是逆序數(shù)字if(n%2 == 0)num = x*mx+y;//構(gòu)造2d位的回文數(shù):x*10^d+yelsenum = x/10*mx+y;//構(gòu)造2d-1位的回文數(shù):x/10*10^d+yif(isPrime(num))a[++ai] = num;}cout << ai << endl;for(int i = 1; i <= ai; ++i)cout << a[i] << ' ';return 0; }解法2:使用vector
#include<bits/stdc++.h> using namespace std; int rev(int x)//得到x的逆序數(shù)字 {int num = 0;//y:x的逆序數(shù)字 for(int a = x; a > 0; a /= 10)num = num*10+a%10;return num; } bool isPrime(int n)//判斷n是否是質(zhì)數(shù) {if(n < 2)return false;for(int i = 2; i <= sqrt(n); ++i){if(n%i == 0)return false;}return true; } int main() {int n, d, x, y, num, mi, mx;//d:用于構(gòu)造回文數(shù)的原數(shù)字位數(shù) vector<int> vec;//保存既是質(zhì)數(shù)又是回文數(shù)的數(shù)字 cin >> n;if(n%2 == 0)d = n/2;elsed = (n+1)/2;mi = pow(10, d-1);//d位數(shù)最小值,為10^{d-1}mx = 10*mi;//d位數(shù)最大值+1,為10^d for(x = mi; x < mx; ++x)//x:用于構(gòu)造回文數(shù)的原數(shù)字 {y = rev(x);//y:x是逆序數(shù)字if(n%2 == 0)num = x*mx+y;//構(gòu)造2d位的回文數(shù):x*10^d+yelsenum = x/10*mx+y;//構(gòu)造2d-1位的回文數(shù):x/10*10^d+yif(isPrime(num))vec.push_back(num);}cout << vec.size() << endl;for(int i = 0; i < vec.size(); ++i)cout << vec[i] << ' ';return 0; }總結(jié)
以上是生活随笔為你收集整理的OpenJudge NOI 1.13 11:回文素数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【win10系统IIS服务器配置】
- 下一篇: 时间管理从用好今目标开始