整數中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 }