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