7-5 回文数文回
分数 300
我们称一个数是回文的,当且仅当它正着读和倒着读是相同的。
例如11或11455411是回文的,而10或1919810不是回文的。
现在给定一个数n,你需要求出区间[108,n]中所有的回文数。
输入格式:
一行一个整数n(108≤n<109)
输出格式:
输出一行一个数,表示题目所求区间中回文数的数量。
输入样例:
在这里给出一组输入。例如:
100000001
输出样例:
在这里给出相应的输出。例如:
1
代码长度限制
16 KB
时间限制
500 ms
内存限制
64 MB
判断一个数是不是回文数是简单的,但是如果这么多数一个一个判断,你不超时谁超时??那怎么办呢?纯数学的办法我不会,但是我有一个办法,就是100000001是第一个回文数,那么就找在他后面第一个最小的回文数。怎么找呢?在中间加1,中间如果是9了,就清零,往两边加。直到加到比判断的上界大。
我习惯用字符串处理比较大的数这类问题,但是如果已经是全9的时候,按照这种办法再加就是全0了,那么就没法比上界大了。这个时候就要做特殊处理了,但是特殊情况也就这一种,当时我就是因为卡到这里就剩5分钟了,然后这题就没有过。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
//回文数的大小能不能用字符串比大小的方法来比较呢
//能的
//八位的回文数
void nexthui(string &num)
{
//half是中间的下标,bo是波动的下标
int half = num.length()/2, bo = 0;
while(bo <= half && num[half+bo] == '9' && num[half-bo] == '9')
{
num[half+bo] = '0', num[half-bo] = '0';
bo++;
}
if(bo)
{
num[half+bo]++, num[half-bo]++;
}
else
{
num[half]++;
}
return;
}
//函数返回下一个最小的回文数
//前提要给一个回文数
int main()
{
string num;
int cnt = 0;
cin >> num;
if(num < "100000001")
{
cout << cnt << endl;
return 0;
}
else
{
string i = "100000001";
do
{
nexthui(i);
cnt ++;
} while (i <= num && i != "999999999");
if(num == "999999999")
cout << cnt+1 << endl;
else
cout << cnt << endl;
}
return 0;
}