11:迴文素數( 1.13程式設計基礎之綜合應用)
阿新 • • 發佈:2019-02-18
11:迴文素數
總時間限制: 5000ms 記憶體限制: 65536kB
描述
一個數如果從左往右讀和從右往左讀數字是相同的,則稱這個數是迴文數,如121,1221,15651都是迴文數。給定位數n,找出所有既是迴文數又是素數的n位十進位制數。(注:不考慮超過整型數範圍的情況)。
輸入
位數n,其中1<=n<=9。
輸出
第一行輸出滿足條件的素數個數。
第二行按照從小到大的順序輸出所有滿足條件的素數,兩個數之間用一個空格區分。
樣例輸入
1
樣例輸出
4
2 3 5 7
分析:
(注意,當是ll型別的時候想要用pow等方法,需要重新自己寫方法)
對n為偶數的情況,直接特殊處理。
對n為奇數的情況,可以先特殊處理n==1的情況,然後對n==3、5、7、9的情況按如下方法處理:
先想辦法夠造出一個n位的迴文數temp然後判斷temp是否是質數。
夠造n位的迴文數temp的方法:用所有的(n+1)/2位的數分別夠造n位的迴文數。例如:可以用123夠造一個5位的迴文數12321.
(注意:123可以夠造出12321和32123兩個迴文數,但是我們只需要使用123夠造12321,在接下來的迴圈過程中會使用321夠造32123這個迴文數。)
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
//http://noi.openjudge.cn/ch0113/11/
//這個題感覺還挺複雜的,關鍵是構造迴文數很難想到
typedef long long ll;
int n;
ll a,b,res[50000],cnt;
ll mypow(int x){//計算並返回10^x
ll ans=1;
for(int i=1;i<=x;i++){
ans=ans*10;
}
return ans;
}
ll hw(ll x){//例如:n等於123,返回12321這樣一個迴文數
ll ans=x;
x=x/10;
while(x>0){
ans=ans*10+x%10;
x/=10;
}
return ans;
}
bool is_prime(ll x){
for(ll i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return true;
}
int main(){
while (cin>>n){
if(n==1)printf("4\n2 3 5 7\n");
else if(n==2)printf("1\n11\n");
else if(n%2==0)printf("0\n");
else{
cnt=0;
n=(n+1)/2;
a=mypow(n-1);//構造[a,b)區間內的迴文數
b=mypow(n);
for(ll i=a;i<b;i++){
ll t=hw(i);
if(is_prime(t)){
res[cnt++]=t;
}
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++){
cout<<res[i]<<" ";
}
cout<<endl;
}
}
}