题目大意:
有t个样例,每个样例给你一个数字n,问你在1到n的范围里有多少个数字它每位数都是一样的数字。
比如11,22,33这些数字就是一样的数字
思路:
细想一下我们可以发现其实这些每位数相同的数字都是1,11,111等数字的倍数
按这个思路我们只需要找到离n最近的1111······的数字就可以利用n/这个数字再加上这个数字位数减-1乘9就可以了
但这里还有个问题(昨晚就被卡了…睡觉的时候才想明白哪出了问题)
就是像10/1,110/11的时候是10,但是里面只有9个数字是每位数都相同的
这个时候算的时候就要当n/111······>9的时候都要算成9
这样才能防止加10的情况
(被卡test 2的很多应该都是这个原因)
AC代码
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int m=1;
int bit=0;
while(m<=n)//找最接近n的111······的数字
{
if(m*10+1<=n)
{
m*=10;
m++;
}
else break;
bit++;
}
int ans=bit*9+n/m;
if(n/m>9)ans=bit*9+9;//防止出现加10的情况
cout<<ans<<endl;
}
return 0;
}