-
问题链接:
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;
}