1. 程式人生 > >C語言求迴文素數

C語言求迴文素數

1.問題描述

所謂迴文素數指的是,對一個整數n從左向右和從右向左讀其數值都相同且n為素數,則稱整數為迴文素數。

對於偶數位的整數,除了11以外,都不存在迴文素數。即所有的4位整數、6位整數、 8位整數…都不存在迴文素數。下面列出兩位和三位整數中包含的所有迴文素數。

兩位迴文素數:11

三位迴文素數:101、131、151、181、191、313、353、373、383、727、757、787、 797、 919、 929

本題要求解的問題是:求出所有不超過1000的迴文素數。

問題分析

本題要使用判斷素數的方法,並且要解決如何求一個整數的迴文數。

採用的方法是窮舉法。對1000以內的每一個整數n進行考察,判斷n是否為迴文數。如果n是迴文數,再判斷它是否為素數,對於既是迴文數也是素數的整數n,就是要求的迴文素數,將其列印輸出即可。


由於題目要求解的是所有不超過1000的迴文素數,因此最後的結果中應該包含兩位和三位的迴文數。

採用窮舉法來構造一個整數並求與其對應的反序數,若整數與其反序數相等,則該整數是迴文數。

演算法設計

在問題分析中己經確定要採用窮舉法逐一考察1000以內的每個整數,因此本題的演算法設計可以釆用迴圈結構來完成。

通過三重迴圈來遍歷所有1000以內的整數。用三個迴圈變數來構造整數n,同時,這三個迴圈變數反序便可以構造出n的反序數m。其中,特別要注意的是如果n的個位為0,接下來要做的就是比較m和n的值是否相等,如果相等,則表明整數n是迴文數。再來判斷n是否是素數,如果n同時也為素數,則n為迴文素數,將其打印出來即可。

下面是完整的程式碼:

#include<stdio.h>
int fun(int n);
int main()
{
    int i, j, k, n, m;
    printf("不超過1000的迴文數:\n");
    for(i=0; i<=9; ++i)  /*窮舉第一位*/
        for(j=0; j<=9; ++j)  /*窮舉第二位*/
            for(k=0; k<=9; ++k)  /*窮舉第三位*/
            {
                n=i*100+j*10+k;  /*計算組成的整數*/
                m=k*100+j*10+i;  /*計算對應的反序數*/
                if(i==0 && j==0)  /*處理整數的前兩位為0的情況*/
                {
                    m=m/100;
                }
                else if(i==0)  /*處理整數的第一位為0的情況*/
                {
                    m=m/10;
                }
                if(n>10 && n==m && fun(n))  /*若大於10且為迴文素數,則輸出*/
                {
                    printf("%d\t", n);
                }
            }
    printf("\n");
   
    return 0;
}
/*判斷引數n是否為素數*/
int fun(int n)
{
    int i;
    for(i=2; i<(n-1)/2; ++i)
    {
        if(n%i == 0)
            return 0;
    }
    return 1;
}
執行結果:
不超過1000的迴文數:
11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929

轉載來自:c語言中文網

2.一億以內的迴文素數

題目分析:
1.多組測試資料,所以先打表。
2.先求質數再判斷迴文,效率低下;所以先構造迴文數,再判斷質數。
3.偶數位的迴文數都能被11整除,自己證明去。所以,偶數位的迴文數除了11都是合數。
4.一個k位數,可以構造出一個奇數位的迴文數。比如13,可以構造131;189可以構造18981.所以100000000內的只要從1構造到9999即可。
5.若範圍為1000000000,那麼明顯超出int範圍,要用long long。當然此題無此陷阱。
6. 最後按從小到大的順序輸出,優先佇列搞定。
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <cstdlib>  
#include <queue>  
#include <cmath>  
#include <vector>  
#define MAXN 10000  
#define RST(N)memset(N, 0, sizeof(N))  
using namespace std;  
  
typedef long long LL;  
  
struct cmp  
{  
    bool operator()(const int &a, const int &b)  
    {  
        return a > b;  
    }  
};  
  
priority_queue <int, vector<int>, cmp> pq;  
  
bool is_prime(int x)  
{  
    for(int i=2; i<sqrt(x+0.5); i++) {  
        if(x % i == 0) return false;  
    }  
    return true;  
}  
  
int main()  
{  
    //freopen("data.in", "r", stdin);  
    //freopen("data.out", "w", stdout);  
    while(!pq.empty()) pq.pop();  
    pq.push(11);  
    int sum, tmp;  
    for(int i=2; i<MAXN; i++) {  
        for(sum=i, tmp=i/10; tmp!=0; tmp/=10) {  
            sum = sum*10 + tmp%10;  
        }  
        if(is_prime(sum)) pq.push(sum);  
    }  
    while(!pq.empty()) {  
        cout << pq.top() << endl;  
        pq.pop();  
    }  
    return 0;  
}  
轉載來自:http://blog.csdn.net/u011225629/article/details/48109673