转载:https://blog.youkuaiyun.com/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 <iostream>
#include <cmath>
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;
}