タイトル説明
1生じ1〜13の整数の数を計算し、そして生じ1で100〜1300倍の数の整数を計算?彼は特に約1〜13まで数えて、この目的を達成するために1は、したがって、6回の合計を表示さ1,10,11,12,13持つ数字が含まれていますが、彼Meizhe後ろの問題のために。ACMerは、あなたが彼を助けることを願っていますし、問題がより一般化され、範囲1が表示され、非負の整数の数(1からnまでの発生回数。1)は、すぐに任意のを見つけることができます。
アイデア:数は数1を含む各間隔で計算、とまで追加されます。
1 クラスソリューション{ 2 プライベート: 3 int型 NumberOf1(符号なし整数のN){ 4 int型の CNT = 0 。 5 しばらく(N){ 6 場合(N%10 == 1 ){ 7 CNT ++ 。 8 } 9 N / = 10 。 10 } 11 リターンCNT。 12 } 13 公共: 14 INTNumberOf1Between1AndN_Solution(int型N) 15 { 16 のint番号= 0 。 17 のために(符号無し整数 I = 1 ; I <= N; ++ I){ 18 数+ = NumberOf1(I)。 19 } 20 リターン番号。 21 } 22 }。
アイデア2:直接分析をN、数学的帰納法を使用して、法律をまとめました
例えば、N = 5桁ABCDE、私たちは、主に次の3つの条件では、Cの百を分析します:
、12 199合計1300 199,12100 - 11 11から00 100 00から199 01 100〜01 199、...、100:1)の場合、C == 0は、例えば13013ため、この場合は百1表示され明らかに、高い数値によって、およびビットの現在の数の影響によってこの決定は、結果は、現在の中央値(乗じ:(上位桁))である;
2)ときに、C == 1、など13113、百確か1現れます、結果は、(現在の中央値)+(下位桁)+ 1を乗算):(デジタル高い00 100 114〜00 113の合計; C = 0を含む、また、それが低い場合を考慮することが必要
3)場合C> 11 100〜12 100 199,12 199,13100 13199〜、CO-1400 ......、11〜00 100 00 199 01 100〜01 199 = 2、ときに、例えば13213ため、この場合は百1表示され、これは唯一の高番号によって決定され、その結果、より高い桁:( +1)現在の中央値が乗算されます。
1 クラスソリューション{ 2 公共: 3 INT NumberOf1Between1AndN_Solution(int型N) 4 { 5 長い 長い低い、より高い、CUR。 6 長い 長い CNT = 0 。 7 長い 長い因子= 1 。 8 のために(int型 i = 1 ; iは= <N; iは* = 10 ){ 9 = N%低いiは、 10 (i *が高い= N / 10 )。 11 CUR =(N / I)%10 。 12 であれば(CURの== 0 ){ 13 、CNT + =高い* I。 14 } そう であれば(CURの== 1 ){ 15 、CNT + =高い* iが低い+ + 1 。 16 } 他{ 17 CNT + =(より高い+ 1)* I。 18 } 19 } 20 リターンCNT。 21 } 22 }。
3思考:デジタルDPを(検討中)
1 クラスソリューション{ 2 公共: 3 int型 DP [ 30 ] [ 30 ]。 4 int型の桁[ 30 ]。 5つの 6 INTの DFS(int型 L、int型の CNT、ブールフラグ){ 7 場合(1- == 0)戻りCNT。 8 あれば(フラグ&&〜DP [L] [CNT]!)戻りDP [L] [CNT]。 9つの int型の POS =フラグ?桁[L]:9 。 10 int型 RET =0 ; 11 のために(int型 I = 0 ; iが= POSを<; Iは++ ){ 12 RET + = DFS(L - 1、CNTの+(I == 1)、フラグ&&(POS == I))。 13 } 14 であれば(フラグ!の)DP [L] [CNT] = RET。 15 リターンRET; 16 } 17 18 int型 countDigitOne(int型N){ 19 のmemset(DP、 - 1、はsizeof (DP))。 20台の int型の POS = 0 。 21 一方、(N){ 22 桁[++ POS] = N%10 。 23 N / = 10 。 24 } 25の リターン DFS(POS、0、真の); 26 } 27 }。