51Nod 1009 數字1的數量 數字規律

2021-10-05 14:06:02 字數 1943 閱讀 3792

2. 解讀

3. **

time limit: 1000 ms

memory limit: 131072 kb

給定乙個十進位制正整數n

nn,寫下從1開始,到n

nn的所有正數,計算出其**現所有1的個數。

例如:n=12

n = 12

n=12

,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。

輸入n (1

≤n≤1

09

)n(1 \le n \le 10^9)

n(1≤n≤

109)

輸出包含1的個數

12
5
51nod 1009 數字1的數量

從低位到高位,依次考慮每一數字為1時,其他的數字能夠取多少種情況。

定義以下符號:

pos: 數字

posnum: 數字上的數字

posscale: 當前數字代表的數量級,pos

scal

e=10

po

sposscale = 10^

possca

le=1

0pos

left: 左邊的數字

right: 右邊的數字

current: 當前計數

ans: 累計計數

判斷有多少種情況的方法如下:

若當前數字大於1,則將當前數字設定為1時

若當前數字等於0,則將當前數字設定為1時

若當前數字等於1,則將當前數字設定為1時 以n=

123n = 123

n=123為例

posposnum

posscale

left

right

current

ans031

120131312

101320

3321100023

2457

得到的答案為57

#include

using

namespace std;

intcal

(int n)

else

if(posnum ==0)

else

if(posnum ==1)

// 取下乙個數字

pos++

; posscale *=10

;}return ans;

}int

main()

return0;

}

數字規律**參考自一位博主的部落格。

還有一種動態規劃方法,參考自另一位博主的部落格

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =20;

ll dp[maxn]

[maxn]

, a[maxn]

;ll dfs

(int pos,

int num,

int limit)

ll solve

(ll x)

return

dfs(pos-1,

0,1)

;}intmain

(void

)

github:

51nod 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 ...

51 nod 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 ...

51nod 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 輸入n 1 ...