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