Calcule el número de cada bit de menor a mayor.
Tome 3104 como ejemplo, divídalo en tres partes: bit alto alto, bit de corriente actual, bit bajo bajo
(1) Al contar el número de ocurrencias de un solo dígito: alto = 310; cur = 4, bajo = 0.
Cuando 0 ~ 309 cambia, cur solo tiene 1 caso, por lo que hay 310 1s, porque cur = 4, por lo que cuando el bit alto es 310, también hay un 1; por lo que el número de veces que aparece 1 cuenta = 311;
(2) Al calcular el lugar de las decenas: alto = 31, cur = 0, bajo = 4.
Cada vez que 0 ~ 30 cambios, cur y low solo tienen 10 1s cuando son 10 ~ 19, porque cur = 0, entonces cuando el bit alto es 31, el número máximo es 3104, y no habrá 1, por lo que el número de ocurrencias del recuento de diez dígitos = 31 * 10 = 310;
(3) Al calcular cientos: alto = 3, cur = 1; bajo = 4:
Cada vez que cambia 0 ~ 2, cur y low solo tienen 100 1s cuando son 100 ~ 199, porque cur = 1, entonces cuando el bit alto es 3, hay 5 1s en los cientos, es decir, 3100 ~ 3104, entonces 1 en los cientos El número de veces cuenta = 3 * 100 + 5 = 305;
(4) Al contar miles: alto = 0, cur = 3, bajo = 104.
Como cur = 3, hay 1000 1s cuando cur y low son 1000 ~ 1999, y count = 1000.
Suma para obtener el recuento = 1926.
El algoritmo es: i = 1, 10,100 ... representa las unidades, decenas, cientos ...
si (cur == 0)
cuenta = alto * i;
si (cur == 1)
recuento = alto * i + bajo + 1;
si (cur> 1)
cuenta = (alto + 1) * i;
int countDigitOne ( int n) { int i = 1 ; int cuenta = 0 ; while ((n / i! = 0 ) { int high; int cur; int low; high = n / (i * 10 ); cur = (n / i)% 10 ; low = n - (n / i * i ); if (cur == 0 ) { count + = (high * i); } else if(cur == 1 ) { cuenta + = (alto * i) + bajo + 1 ; } else if (cur> 1 ) { count + = (high + 1 ) * i; } i * = 10 ; } cuenta de retorno ; }
2020/4/20
00:30