A.到達可能な番号
機能を表すと 、Fの(X )ように、F(X):我々は、追加 1に1を Xの得られた数のゼロを末尾少なくとも一つがあるが、その後、X、我々はゼロことを削除します。例えば、
- F (599 )= 6、F(599)= 6: 599 + 1 = 600 → 60 → 6 599 + 1 = 600→60→6。
- F (7 )= 8 F(7)= 8: 7 + 1 = 8 7 + 1 = 8。
- F (9 )= 1、F(9)= 1: 9 + 1 = 10 → 1 9 + 1 = 10→1。
- F (10099 )= 101 F(10099)= 101: 10099 + 1 = 10100 → 1010 → 101 10099 + 1 = 10100→1010→101。
我々はいくつかの数のことを言う のy yがある から到達可能な X我々は関数を適用することができた場合のx 、F、Fへ のxのx、いくつかの(おそらくゼロ)時間を我々が得るように、 yの結果として、yと。例えば、 102 102が到達可能であるから 10098 10098ため、 F (F (F (10098 )))= F (F (10099が))= F (101 )= 102 F(F(F(10098)))= fは(F (10099))= F(101)= 102。そして、任意の数自体から到達可能です。
あなたが番号を与えられている n個のn; あなたのタスクはから到達可能であるか、多くの異なる数数えることである n個のn。
入力
最初の行は、一つの整数含ま のn(nは1 ≤ N ≤ 10 9 1≤n≤109を)。
出力
到達可能な異なる数の数:1つの整数印刷 のnのnを。
1つの#include <ビット/ STDC ++ H> 2 <の#include 設定 > 3 使用して 名前空間STDを、 4のtypedef 長い 長LL。 5 int型 F(INT X){ 6 ながら((X + 1)%10 == 0 ){ 7 、X =(X + 1)/ 10 - 1 。 8 } 9 X = X + 1 。 10 リターンX。 11 } 12 INTメイン(){ 13 のLL N、CNT = 0 。 14 ブールフラグ= 真。 15 セット < 整数 > D; 16 CIN >> N。 17 LLのA = N。 18 d.insert(A)。 19 一方(フラグ){ 20 、A = F(A)。 21 CNT ++ ; 22 用(セット < 整数 > ::イテレータはd.beginを()=;!それ= d.end();それ++ ){ 23 場合(*それは== {a)の 24を coutの<< CNT。 25 リターン 0 ; 26 } 27 } 28 d.insert(A)。 29 } 30 }
アイデアの分析:、コレクションを、コレクションへの各呼び出しに関数の値次いで、ゼロで終わる関数を作成するセット内の出口の任意の数のコレクションへの新規参入者の数に等しくなるようにすると同時に、コレクション要素の数を出力する第1。