NOI:1930 素数回文数的个数

转载:https://blog.csdn.net/tigerisland45/article/details/70236364

问题链接POJ NOI0113-05 素数回文数的个数

原题出处:Bailian2928 素数回文数的个数。


总时间限制:
1000ms
内存限制:
65536kB
描述

求11到n之间(包括n),既是素数又是回文数的整数有多少个。

输入
一个大于11小于1000的整数n。
输出
11到n之间的素数回文数个数。
样例输入
23
样例输出
1
提示
回文数指左右对称的数,如:292,333。
来源
06计算概论课


问题分析

  这是一个判定计数的问题,需要判定一个数是否为素数和回文数。

 

程序说明

  函数isprime()用来判定一个数是否是素数;函数ispalindrom()用来判定一个整数是否为回文数,这是一个更为通用的函数,可以指定进制。

  使用函数进行判定时,先调用哪个函数也是有讲究的,一要看那个函数的计算时间,二要看判定成功的概率,需要综合考虑。

#include   
#include   
  
using namespace std;  
  
const int START = 11;  
  
bool isprime(int n)  //判断是否是素数
{  
    if(n == 1)  
        return false;  
  
    if(n == 2)  
        return true;  
  
    if(n % 2 == 0)  
        return false;  
  
    int end = sqrt(n);  
    for(long i=3; i<=end; i+=2)  
        if(n % i == 0)  
            return false;  
  
    return true;  
}  
  
bool ispalindrom(int n, int base)  //判断回文
{  
    int palindrom = 0, temp;  
  
    temp = n;  
    while(temp) {  
        palindrom *= base;  
        palindrom += temp % base;  
        temp /= base;  
    }  
  
    return n == palindrom;  //将数倒着计算判断是否相等
}  
  
int main()  
{  
    int n, count;  
  
    cin >> n;  
  
    count = 0;  
    for(int i=START; i<=n; i++)  
        if(ispalindrom(i, 10) && isprime(i))  
            count++;  
  
    cout << count << endl;  
  
    return 0;  
}  

你可能感兴趣的:(NOI,NOI)