题目分析:
题意:给一个数n,对n加一,如果(n+1) % 10 == 0 那么 (n+1) / 10 ,如果 (n+1)/10 % 10 == 0 那么( n+1 )/10/10 ,直到这个数无法被10整除,这样我们得到了经过上面操作后的一个数 x, x满足题目的要求,然后继续对x加一,继续上面的操作,又得到了一个新的数/y依次类推,问经过无数次操作后,可以得到多少这样的数(不可重复)
解题思路:
我们对这个数的每一个位数时一次性统计完包含的数,也就是从当前这个数开始,不断地加一,直到这个数可以被10整出,那么就对其除10,直到不可以被0整除,这样我们的数的位数一定会降低,那么我们继续统计这个位数的情况下的所有包含的数,重复上面操作
不过,应该注意到了一个情况,那就是当n为个位数的时候,不断地对n进行加一,最后会不断地的死循环,而由于当n为任意的个位数(0以外)的时候,经过操作都可以得到9个可满足的数,那么我们只需要先将这9个数当作必然结果,对给定的数不断地进行上面的操作,直到这个数小于10,我们就可以退出上面的操作循环了,最后输出答案。
代码区
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
const int Max = 2e5 + 10;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int sum = 9;
while (n >= 10)
{
sum += 9 - n % 10 + 1;
n /= 10;
n++;
while (n % 10 == 0)n /= 10;
}
printf("%d\n", sum);
}
return 0;
}