题解:
1-10 9
10-100 9
100-1000 90
1000-10000 90
怎么推
所以每一个回文数只需要确认他是自己位数的第几个,再加上比他位数少的所有个数
怎么确认是自己位数的第几位,可以通过取位数的一半,如果是偶数直接取一半和99相减看有多少个,
奇数就需要取一半后再加一
代码
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int p[12];
p[1]=9;
p[2]=9;
for(int i=3; i<12; i+=2)
{
p[i]=p[i-2]*10;
p[i+1]=p[i-1]*10;
}
p[0]=0;
for(int i=1; i<12; i++)
{
p[i]+=p[i-1];
}
char num[15];
while(scanf("%s",num)!=EOF)
{
int len=strlen(num);
if(len<=2)
{
cout<<p[len-1]+(num[0]-'0')<<endl;
}
else
{
int ss=0;
int len1=len/2;
if(len%2)len1++;
for(int i=0;i<len1;i++)
{
ss=(num[i]-'0')+ss*10;
}
int s=pow(10,len1-1)-0.5;
ss-=s;
cout<<ss+p[len-1]<<endl;
}
}
return 0;
}