11:回文素數
總時間限制:5000ms內存限制:65536kB
描述
一個數如果從左往右讀和從右往左讀數字是相同的,則稱這個數是回文數,
如121,1221,15651都是回文數。給定位數n,找出所有既是回文數又是素數的n位十進制數。
(注:不考慮超過整型數范圍的情況)。
輸入
位數n,其中1<=n<=9。
輸出
第一行輸出滿足條件的素數個數。
第二行按照從小到大的順序輸出所有滿足條件的素數,兩個數之間用一個空格區分。
樣例輸入
1
樣例輸出
4
2 3 5 7
分析:參見百度百科
回文素數是一個既是素數又是回文數的整數。回文素數與記數系統的進位制有關。
回文素數是指,對一個整數n(n≥11)從左向右和從右向左讀其結果值相同且是素數,即稱n為回文素數。
除了11,偶數位的數不存在回文質數。4位,6位,8位……數不存在回文質數。
最初幾個回文素數:11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929……兩位回文素數1個,三位回文素數15個,五位回文素數93個,七位回文素數668個,九位回文素數5172個。
思路:
對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這個回文數。)
具體代碼:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 int isPrime(int n);//判斷n是否質數 5 long long huiWen(int n);//例如:n等於123,返回12321這樣一個回文數 6 long myPow(int x);//計算並返回10^x 7 8 int main() 9 { 10 int n; 11 long begin,end,i; 12 long long a[8000]={0},count; 13 long long temp=0; 14 15 freopen("11.IN","r",stdin); 16 freopen("11.out","w",stdout); 17 18 scanf("%d",&n); 19 20 if(n==2) printf("1\n11\n"); 21 else if(n%2==0) printf("0\n"); 22 else if(n==1) printf("4\n2 3 5 7\n"); 23 else 24 { 25 n=(n+1)/2; 26 begin=myPow(n-1); 27 end=myPow(n); 28 count=0; 29 for(i=begin;i<end;i++) 30 { 31 temp=huiWen(i); 32 if(isPrime(temp)==1) { a[count]=temp; count++; } 33 } 34 printf("%d\n",count); 35 for(i=0;i<count;i++) 36 { 37 printf("%d ",a[i]); 38 } 39 } 40 return 0; 41 } 42 int isPrime(int n) 43 { 44 int x,i; 45 x=sqrt(n); 46 for(i=2;i<=x;i++) 47 { 48 if(n%i==0) return 0; 49 } 50 return 1; 51 } 52 long long huiWen(int n)//例如:n等於123,返回12321這樣一個回文數 53 { 54 long long ans=n; 55 n=n/10; 56 while(n>0) 57 { 58 ans=ans*10+n%10; 59 n=n/10; 60 } 61 return ans; 62 } 63 long myPow(int x)//計算並返回10^x 64 { 65 int i; 66 long ans=1; 67 for(i=0;i<x;i++) ans=ans*10; 68 return ans; 69 }
題目連接:http://noi.openjudge.cn/ch0113/11/