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