11:回文素數


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM