POJ NOI MATH-7655 回文数个数

来源:互联网 发布:小超市记账软件 编辑:程序博客网 时间:2024/05/14 21:25
问题链接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;}




0 0
原创粉丝点击