階梯數字


提交程序

分数: 100 (部分)
时间限制: 1.0s
内存限制: 256M

作者:
题目类型
允许的语言
C, C++

阿明最近在學習程式語言,他對一些特別的正整數很有興趣,他發現一些十進數的每一位數已排好順序,從高位數往低位數看過去,每一位數字只會相等或變大,例如:\(9\)、\(234\)、\(777\)、\(11222233\) 等數字都有這性質,他稱這些數字為階梯數字。

給定一正整數 \(N\),阿明想知道不大於 \(N\) 的階梯數字總共有幾個,請注意本題只算正整數,所以 \(0\) 不算階梯數字,而且階梯數字不會以 \(0\) 開始。請幫阿明寫計算階梯數字的個數。

提示:對於 \(N\) 不大的情形,例如 \(100000\),我們可以枚舉每一個不超過 \(N\) 的數字來判斷。對於 \(N\) 很大的時候,就需要比較快速的方法了。我們知道所有的一位數 \(1\sim 9\) 都是階梯數字,如果要計算 \(D\) 位數的階梯數字總數,我們可以依據最高位數字分成 \(9\) 類,然後根據\((D - 1)\)位的 \(9\) 類階梯數字總數來計算。

輸入格式

一個正整數 \(N\)。

  • \(1\leq N\leq 10^{18}\)

輸出格式

輸出不大於 N 的階梯數字總個數。

範例輸入1

25

範例輸出1

22

範例輸入2

23456

範例輸出2

1365

說明

在範例輸入 \(1\) 中,不大於 \(N\) 的階梯數字分別為 \(1\sim 9\), \(11\sim 19\), \(22\sim25\),故最終輸出 \(22\)。

子題

#No. 額外限制 分數
1 範例測資 0
2 \(N \leq 10^5\) 30
3 \(N = a*10^b\),\(a\) 與 \(b\) 均為整數,且 \(1 \leq a \leq 9\),\(10 \leq b \leq 17\) 20
4 \(N \leq 10^{18}\) 50

评论

目前没有评论。