1つのタイトル説明
1生じ1〜13の整数の数を計算し、そして生じ1で100〜1300倍の数の整数を計算?彼は特に約1〜13まで数えて、この目的を達成するために1は、したがって、6回の合計を表示さ1,10,11,12,13持つ数字が含まれていますが、彼Meizhe後ろの問題のために。ACMerは、あなたが彼を助けることを願っていますし、問題がより一般化され、範囲1が表示され、非負の整数の数(1からnまでの発生回数。1)は、すぐに任意のを見つけることができます。
2つのアイデアや方法
各整数nは小数点以下の桁1は、どんなに疲れて一緒に、発生しない回数をカウントします。ビット毎にフロントの数(開始)+中間体(中間)+後端(端部)に分割することができます。百1234 + 2 + 1 = 34
3 C ++コアコード
シンプルバージョンます。https://blog.csdn.net/typantk/article/details/88386888(あまりにも良い説明)
1 クラスソリューション{ 2 公共: 3 int型 NumberOf1Between1AndN_Solution(int型N) 4 { 5つの int型のもの= 0 。 6 用(長 M = 1、M <= N; M * = 10 ) 7つ のもの+ =(N / M + 8)/ 10 * Mが+(N / M%10 == 1、N%M +?1:0 )。 8つの 戻りもの。 9 } 10 }。
コードより
1 クラスソリューション{ 2 公共: 3。 int型 NumberOf1Between1AndN_Solution(INT N-) 4。 { 5。 int型の TEMP = N-; 6。 INT 最後; 7。 int型の結果= 0 ; 8。 int型の ベース = 1 ; 9。 一方、(TEMP){ 10 ラスト= TEMP%で10 ; // 数字かどうか1。 11。 TEMPのTEMP = / 10 ; //は数字削除 12 結果+ = TEMP * 基地; 13 であれば(最後== 1 ){ 14 結果+ = Nの%の基地 + 1 。 15 } 16 他の 場合(最後> 1 ){ 17 + =結果塩基; 18 } 19 ベース * = 10 。 20 } 21 リターン結果。 22 } 23 }。
完全4. C ++コード
1つの#include <iostreamの> 2 3 使用して 名前空間STDを、 4 5 長い 長い楽しい(長い 長N) 6 { 7 場合(N < 1 ) 8 戻り 0 ; 9 長い 長カウント= 10、NUM = 0 、開始、中間、終了、M。 10 開始= N。 11 中央= 0 。 12 端= 0 。 13 一方(開始) 14 { 15は、 開始= N / 数えます。 16 M = N%カウント。 17 中央=のM /(/カウント10 )。 18 端= Mの%(/カウント10 )。 19 であれば(中央> 1 ) 20 NUM = NUM +(カウント/ 10)*(+始まる1 )。 21 他の 場合(中央== 1 ) 22 NUM = NUM +(カウント/ 10)*(エンド+ +始める1 )。 23 他 24 NUM = NUM +(カウント/ 10)* 始めます。 25 数=数* 10 。 26 } 27 リターンNUM。 28 } 29 30 のint main()の 31 { 32 長い 長N、M。 33 一方(scanf関数(" %のLLDの%のLLD "、&N、&M)=!EOF) 34 { 35 であれば(N> M) 36 のprintf(" %LLDする\ n "、楽しい(N) -楽しい(M - 1)); 37 他の 38 のprintf(" %LLD \ n "、楽しい(M) -楽しさ(N - 1 ))。 39 } 40 のprintf(" %を\ n " ); 41 42 システム(" 一時停止" )。 43 リターン 0 。 44 }
https://blog.csdn.net/zhoubin1992/article/details/47361969
参考資料
https://blog.csdn.net/typantk/article/details/88386888(あまりにも良い説明)
https://blog.csdn.net/u012477435/article/details/83351659#_873