1. 程式人生 > >11:迴文素數( 1.13程式設計基礎之綜合應用)

11:迴文素數( 1.13程式設計基礎之綜合應用)

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; } } }