public int countDigitOne(int n) { int res = 0; // 标记当前位数 个位为1 十位为10 百位为100 。。。。 int digit = 1; // 初始化 // 当前位置前面的数字 int high = n / 10; // 当前位置的数字 int cur = n % 10; // 当前位置后面的数字 int low = 0; while (high != 0 || cur != 0){ // 找规律 cur从0到9 会出现1的公式 if (cur == 0){ res += high * digit; }else if (cur == 1){ res += high * digit + low + 1; }else { res += (high + 1) * digit; } // 重新赋值进行下一轮循环 找下一位会出现1的次数 low += cur * digit; cur = high % 10; high /= 10; digit *= 10; } return res; }