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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenJudge NOI 1.13 11:回文素数

發(fā)布時(shí)間:2024/5/8 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenJudge NOI 1.13 11:回文素数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【題目鏈接】

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。