JZ31 整數中1出現的次數(從1到n整數中1出現的次數)

整數中1出現的次數(從1到n整數中1出現的次數)

輸入一個整數 n ,求1~n這n個整數的十進制表示中1出現的次數
例如,1~13中包含1的數字有1、10、11、12、13因此共出現6次

思路:

設N = abcde ,其中abcde分別爲十進制中各位上的數字。

如果要計算百位上1出現的次數,它要受到3方面的影響:百位上的數字,百位一下(低位)上的數字,百位一上(高位)上的數字。

如果百位上數字爲0,百位上可能出現1的次數由更高位決定。比如:12013,則可以知道百位出現1的情況可能是:100~199,1100~1199,2100~2199,,.........,11100~11199,一共1200個。可以看出是由更高位數字(12)決定,並且等於更高位數字(12)乘以 當前位數(100)。

如果百位上數字爲1,百位上可能出現1的次數不僅受更高位影響還受低位影響。比如:12113,則可以知道百位受高位影響出現的情況是:100~199,1100~1199,2100~2199,,.........,11100~11199,一共1200個。和上面情況一樣,並且等於更高位數字(12)乘以 當前位數(100)。但同時它還受低位影響,百位出現1的情況是:12100~12113,一共114個,等於低位數字(113)+1。

如果百位上數字大於1(2~9),則百位上出現1的情況僅由更高位決定,比如12213,則百位出現1的情況是:100~199,1100~1199,2100~2199,...........,11100~11199,12100~12199,一共有1300個,並且等於更高位數字+1(12+1)乘以當前位數(100)。

func NumberOf1Between1AndN_Solution( n int ) int {
    if n <= 0 {
        return 0
    }
    var base int = 1
    var low int = 0
    var cur int = 0
    var high int = 0
    var cnt int = 0
    for (n/base) !=0 {
        low = n - (n / base) * base
        cur = (n / base) % 10
        high = n / (base * 10)
        if cur == 0 {
            cnt += high * base
        } else if cur == 1 {
            cnt += high * base + low + 1
        } else if cur > 1 {
            cnt += (high + 1) * base
        }
        base *= 10
    }
    return cnt
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章