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

2021-08-26 22:00:51 字數 1409 閱讀 9087

題目:輸入乙個整數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)。

**如下:

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

//#include "stdafx.h"

#include #include using namespace std;

longlong sum1s( ulonglong n )

ifactor *= 10;

} return icount;

}int main()

{ cout << sum1s(123)<

這個演算法速度很快:

結果如下:

在從1到n的正數中1出現的次數

題目 輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。我的思路是計算每一位上1會出現在哪些數字中。建乙個陣列a n 放置每一位,從個位到最高位,0 n,這裡n 4。a 0 5,a 1 0,a ...

在從1到n的正數中1出現的次數

int count1in1ton int n return n int countnumber1 int n return count 程式設計之美上的方法 大體的思路是這樣的 假設n abcde,這裡a,b,c,d,e分別是十進位制數n的各個位數上的數字。如 果要計算百位上出現1的次數,它會受到三...

資料結構練習(45)在從1到n的正數中1出現的次數

思路 這題是程式設計之美上面的一道題,同時也是十分考察觀察力的一道題,對於數字30142 1.對於個位上面的2有2 1,所以個位上面1出現的次數為 3014 1 1 如果字首為0,所以要加1 2.對於十位上面的4有4 1,同樣有十位上面1出現的次數為 301 1 10 3.對於百位上面的1有1 1,...