C 求從1到n的正整數中1出現的次數

2021-06-26 04:40:48 字數 2080 閱讀 4503

程式設計之美中的一道題:

題目:輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。

例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。

問題描述:給定乙個十進位制正整數n,寫下從1開始,到n的所有整數,然後數一下其中出現的所有"1"的個數。例如:

n = 2,寫下1,2。這樣只出現了1個"1"。

n = 12,寫下1,2,……,12,這樣有5個"1"。

寫乙個函式f(n),返回1到n之間出現的"1"的個數,比如f(12) = 5。

假設n = abcde,這裡a,b,c,d,e分別是十進位制數n的各個數字上的數字。如果要計算百位上出現1

的次數,將受3方面因素影響:百位上的數字,百位以下(低位)的數字,百位(更高位)以上的數字。

如果百位上的數字為0,則可以知道百位上可能出現1的次數由更高位決定,比如12 013,則可以知

道百位出現1的情況可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200個。也就是

由更高位數字(12) 決定,並且等於更高位數字(12)×當前位數(100)。

如果百位上的數字為1,則可以知道,百位上可能出現1的次數不僅受更高位影響,還受低位影響,

也就是由更高位和低位共同決定。例如12 113, 受更高位影響,百位出現1的情況是100-199,1 100

-1 199,……,11 100-11 199,一共有1 200個,和上面第一種情況一樣,等於更高位數字(12)×當

前位數(100)。但它還受低位影響,百位出現1的情況是12 100-12 113,一共114個,等於低位數字

(113)+1。

如果百位上數字大於1(即為2-9),則百位上可能出現1的次數也僅由更高位決定,比如12 213,則

百位出現1的情況是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300個

,並且等於更高位數字+1(12+1)×當前位數(100)。

例子我是按照各位做統計的,某位左側代表這個迴圈體出現了幾次,右側代表這個體中1出現了多少遍,如:

30143:

由於3>1,則個位上出現1的次數為(3014+1)*1

由於4>1,則十位上出現1的次數為(301+1)*10

由於1=1,則百位上出現1次數為(30+0)*100+(43+1)

由於0<1,則千位上出現1次數為(3+0)*1000

注:以百位為例,百位出現1為100~199,*100的意思為單步出現了100~199,100次,*30是因為出現了30次100~199,+(43+1)是因為左後一次301**不完整導致。

這樣做的數學思路很清楚但是程式設計並不方便,因為需要知道某一位的數有得知道他前後的數值(每次把乙個數差分成三段不方便遞迴實現和判定終止)livelylittlefish網友提供的方法,就是把規律查分到按大小集合,確實方便程式設計

**如下:

[html]view plain

copy

// 1count.cpp : 定義控制台應用程式的入口點。  

//  

#include "stdafx.h"  

#include <

iostream

>

#include <

windows.h

>

using namespace std;  

longlong sum1s( ulonglong n )  

ifactor *= 10;  

}  return icount;  

}  int main()    

程式設計之美中的一道題 

int numberof1(int n) 

else if(curbits == 1) 

else 

base *= 10; 

if(highbits == 0) 

break; 

} return number; }

這個演算法速度很快:

整數中1出現的次數(從1到n整數中1出現的次數)

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...

整數中1出現的次數(從1到n整數中1出現的次數)

時間限制 1秒 空間限制 32768k 題目描述 include using namespace std class solution 求之前的length 1位中含乙個數 int base1 0 int base2 1 for int i 0 i1 i cout cout cout 求從base2...

整數中1出現的次數(從1到n整數中1出現的次數)

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。演算法一 暴力累加...