1つのオファー現れる安全整数証明(出現回数nは1〜1の整数です)

タイトル説明

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 }。

 

おすすめ

転載: www.cnblogs.com/qinduanyinghua/p/11408010.html