Let's denote a function f(x)f(x) in such a way: we add 11 to xx, then, while there is at least one trailing zero in the resulting number, we remove that zero. For example,
- f(599)=6f(599)=6: 599+1=600→60→6599+1=600→60→6;
- f(7)=8f(7)=8: 7+1=87+1=8;
- f(9)=1f(9)=1: 9+1=10→19+1=10→1;
- f(10099)=101f(10099)=101: 10099+1=10100→1010→10110099+1=10100→1010→101.
We say that some number yy is reachable from xx if we can apply function ff to xx some (possibly zero) times so that we get yy as a result. For example, 102102 is reachable from 1009810098 because f(f(f(10098)))=f(f(10099))=f(101)=102f(f(f(10098)))=f(f(10099))=f(101)=102; and any number is reachable from itself.
You are given a number nn; your task is to count how many different numbers are reachable from nn.
The first line contains one integer nn (1≤n≤1091≤n≤109).
Print one integer: the number of different numbers that are reachable from nn.
1 #include<bits/stdc++.h> 2 #include<set> 3 using namespace std; 4 typedef long long ll; 5 int f(int x) { 6 while((x+1)%10==0) { 7 x=(x+1)/10-1; 8 } 9 x=x+1; 10 return x; 11 } 12 int main() { 13 ll n,cnt=0; 14 bool flag=true; 15 set <int > d; 16 cin>>n; 17 ll a=n; 18 d.insert(a); 19 while(flag) { 20 a=f(a); 21 cnt++; 22 for(set<int>::iterator it=d.begin(); it!=d.end(); it++) { 23 if(*it==a) { 24 cout<<cnt; 25 return 0; 26 } 27 } 28 d.insert(a); 29 } 30 }
思路分析:先编写去尾数0的函数,然后将每次调用函数后的值存入集合,遍历集合,要新加入集合的数等于集合内有的数就退出并同时输出集合元素个数。