若求出1~13的整數中1出現的次數,那麼包括1的數有1、10、11、12、13。因此共出現6次
分析:我們要求1到n的整數中出現1的次數。
思路是分別計算個位、十位、百位........上出現 1 的個數。
以 n =216爲例:
個位上: 1 ,11,21,31,.....211。個位上共出現(216/10)+ 1個 1 。因爲除法取整,210~216間個位上的1取不到,所以我們加8進位。你可能說爲什麼不加9,n=211怎麼辦,這裏把最後取到的個位數爲1的單獨考慮,先往下看。
十位上:10~19,110~119,210~216. 十位上可看成 求(216/10)=21 個位上的1的個數然後乘10。這裏再次把最後取到的十位數爲1的單獨拿出來,即210~216要單獨考慮 ,個數爲(216%10)+1 .這裏加8就避免了判斷的過程。
後面以此類推
詳細看代碼:
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
return func(n);
}
public static int func(int n){
int cnt = 0;
for (int m = 1; m <= n; m *= 10) {
int a = n / m, b = n % m;
cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
}
return cnt;
}
}