數字1的數量

2021-08-20 20:02:30 字數 1604 閱讀 1846

給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。

例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。

input

輸入n(1 <= n <= 10^9)
output

輸出包含1的個數
input示例

12
output示例

5

解法:

1位數的情況:

大於等於1的時候,有1個,小於1就沒有。

2位數的情況:

n=13,個位數出現的1的次數為2,分別為1和11,十位數出現1的次數為4,分別為10,11,12,13,所以f(n) = 2+4。

n=23,個位數出現的1的次數為3,分別為1,11,21,十位數出現1的次數為10,分別為10~19,f(n)=3+10。

由此我們發現,個位數出現1的次數不僅和個位數有關,和十位數也有關,如果個位數大於等於1,則個位數出現1的次數為十位數的數字加1;如果個位數為0,個位數出現1的次數等於十位數數字。而十位數上出現1的次數也不僅和十位數相關,也和個位數相關:如果十位數字等於1,則十位數上出現1的次數為個位數的數字加1,假如十位數大於1,則十位數上出現1的次數為10。

3位數的情況:

n=123

個位出現1的個數為13:1,11,21,…,91,101,111,121

十位出現1的個數為20:10~19,110~119

百位出現1的個數為24:100~123

我們可以繼續分析4位數,5位數,推導出下面一般情況:

假設n,我們要計算百位上出現1的次數,將由三部分決定:百位上的數字,百位以上的數字,百位一下的數字。

如果百位上的數字為0,則百位上出現1的次數僅由更高位決定,比如12013,百位出現1的情況為100~199,1100~1199,2100~2199,…,11100~11199,共1200個。等於更高位數字乘以當前位數,即12 * 100。

如果百位上的數字大於1,則百位上出現1的次數僅由更高位決定,比如12213,百位出現1的情況為100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300個。等於更高位數字加1乘以當前位數,即(12 + 1)*100。

如果百位上的數字為1,則百位上出現1的次數不僅受更高位影響,還受低位影響。例如12113,受高位影響出現1的情況:100~199,1100~1199,2100~2199,…,11100~11199,共1200個,但它還受低位影響,出現1的情況是12100~12113,共114個,等於低位數字113+1。

於是得到以下**:

long countone1(long n)   

return count;

}

題目ac**:

#include using namespace std;

long countone1(long n)

return count;

} int main() {

long n;

cin>>n;

cout<

1009 數字1的數量

給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。input 輸入n 1 n 10 9 output 輸出包含1的個數 input示例 12output示例 5思路 這個題是按照 ...

1009 數字1的數量

1009 數字1的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 收藏 關注 給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。input ...

1009 數字1的數量(思維)

給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其 現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。輸入輸入n 1 n 10 9 輸出輸出包含1的個數 輸入樣例 12輸出樣例 5乙個多位數21905 個位 它出現1的數為 1 219...