整数番号1現れる(出現回数nは1〜1の整数である):安全offer31を証明

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 +?10 )。
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

おすすめ

転載: www.cnblogs.com/wxwhnu/p/11415964.html