Bailian2928 POJ NOI0113-05 素数回文数的个数【数论】

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

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

 


总时间限制:

1000ms

内存限制:

65536kB

描述

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

输入

一个大于11小于1000的整数n。

输出

11到n之间的素数回文数个数。

样例输入

23

样例输出

1

提示

回文数指左右对称的数,如:292,333。

来源

06计算概论课

 


问题分析

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

 

程序说明

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

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

 

 

 


 

参考链接:(略)。

 

 

 


 

AC的C++语言程序:

 

#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;
}

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值