1. 程式人生 > >【劍指offer】43、1~n整數中1出現的次數

【劍指offer】43、1~n整數中1出現的次數

ase 表示 eight pre pub 題目 我們 return 1出現的次數

題目

輸入一個整數,求1~n的整數十進制表示中1出現的次數。如12,有1,10,11,12,總共出現了5次。

思路

註意不是統計出現1的數字的多少,而是統計1出現了幾次。

我們按位來分析

個位:

技術分享圖片

如果weight=0,則個位出現1的次數 = round

如果weight>=1,則個位出現1的次數=round + 1

十位:

技術分享圖片

如果weight=0,則次數 = round * base

如果weight=1,則次數 = round * base + former + 1 ( former = n % base )

如果weight>1,則次數 = round * base + base

百位:和十位一樣

例如534 = 個位 + 十位 + 百位 = (53*1 +1) + (5*10+10) + (0*100 + 100) =214

2105 = (210*1+1) + (21*10) + (2*100+ 2105%100 + 1) + (0*1000 + 1000) = 3517

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n < 1)
            return 0;
        int count = 0, base = 1, round = n;
        
while(round > 0){ int weight = round % 10; round /= 10; count += round*base; if(weight == 1) count += (n%base) + 1; else if(weight > 1) count += base; base *= 10; } return count; } };

【劍指offer】43、1~n整數中1出現的次數