POJ NOI MATH-7655 回文数个数

问题链接POJ NOI MATH-7655 回文数个数


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

描述

不超过n位的正整数中,有多少个回文数?

输入
一个正整数n,n <= 10。
输出
一个整数,即回文数个数。
样例输入
5
样例输出
1098
来源
《奥数典型题举一反三(小学五年级)》 (ISBN 978-7-5445-2882-5) 第一章 第二讲 习题16



问题分析

  用穷举法进行计算是一种方法,但是容易导致运行时间超时。

  需要考虑采用递推和组合计算的办法来实现。

  只要能够写出递推式,就容易写一个递归函数来实现。简单的递归函数,往往也能找到其递推的计算方法。递归程序往往逻辑更加简洁易懂,递推程序速度更快并且使用的空间更少,两者各有优势。

程序说明

  给出的穷举法程序,时间上超时了

  程序中,函数palindrom()和函数palindrom2()的功能是完全一样的,前者是递归实现的,后者是递推实现的。




AC的C++语言程序:

#include <iostream>

using namespace std;

const int BASE = 10;

int palindrom(int n)
{
    if(n == 1 || n == 2)
        return BASE - 1;
    else {
        if(n % 2 == 1)
            return palindrom(n-1) * BASE;
        else
            return palindrom(n-2) * BASE;
    }
}

// 递推的计算回文数函数,参数为10进制位数
int palindrom2(int n)
{
    if(n == 1 || n == 2)
        return BASE - 1;

    int p1= BASE - 1, p2 = BASE - 1, i, temp;

    i = 2;
    while(i < n) {
        i++;
        if(i % 2 == 1) {
            p1 = p2;
            p2 = p1 * BASE;
        } else {
            temp = p1;
            p1 = p2;
            p2 = temp * BASE;
        }
    }

    return p2;
}

int main()
{
    int n, sum;

    cin >> n;

    sum = 0;
    for(int i=1; i<=n; i++)
        sum += palindrom2(i);

    cout << sum << endl;

    return 0;
}



TLE(Time Limit Exceeded)的C++语言程序:

#include <iostream>

using namespace std;

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, max, count;

    cin >> n;

    max = 1;
    for(int i=1; i<=n; i++)
        max *= 10;
    max -= 1;

    count = 0;
    for(int i=1; i<=max; i++)
        if(ispalindrom(i, 10))
            count++;

    cout << count << endl;

    return 0;
}




posted on 2017-04-03 22:47  海岛Blog  阅读(490)  评论(0编辑  收藏  举报

导航