假設 n = xyzdabc
,此時我們求千位是 1
的個數,也就是 d
所在的位置。
那麼此時有三種情況,
d == 0
,那麼千位上1
的個數就是xyz * 1000
d == 1
,那麼千位上1
的個數就是xyz * 1000 + abc + 1
d > 1
,那麼千位上1
的個數就是xyz * 1000 + 1000
代碼如下:
public int countDigitOne(int n) {
int count = 0;
//依次考慮個位、十位、百位...是 1
//k = 1000, 對應於上邊舉的例子
for (int k = 1; k <= n; k *= 10) {
// xyzdabc
int abc = n % k;
int xyzd = n / k;
int d = xyzd % 10;
int xyz = xyzd / 10;
count += xyz * k;
if (d > 1) {
count += k;
}
if (d == 1) {
count += abc + 1;
}
//如果不加這句的話,雖然 k 一直乘以 10,但由於溢出的問題
//k 本來要大於 n 的時候,卻小於了 n 會再次進入循環
//此時代表最高位是 1 的情況也考慮完成了
if(xyz == 0){
break;
}
}
return count;
}