¿Cómo hallar el número de dígitos en una secuencia de números?

publicado por: Anonymous

Se puede obtener una secuencia de dígitos escribiendo la representación decimal de todos los números desde 1 hasta N consecutivamente como se muestra a continuación:

1234567891011121314….N

Por ejemplo, si la entrada es 15 la salida es 21, porque 123456789101112131415 tiene 21 dígitos.

¿Cómo contar el número de dígitos?

Este es un intento de solución, pero dice que no funciona para todos los casos y no encuentro el caso para el que falla (el problema es para una asignatura en línea que me evalúa con varios casos de prueba, pero no dice en cuales falla):

#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;

int digitos = 0;
int iteracion = 1;
int longitud = 1;

if(n<10){
    digitos += n;
}

if(n>=10 && n<100){
    digitos += 9+(n-9)*2;
}

if (n>=100){
    for (int i= n; i >= 10; i /= 10,iteracion *= 10,++longitud){

    digitos += ((9 * iteracion) * longitud);
}digitos += (((n % iteracion) + 1) * longitud);
}

cout << digitos <<endl;

return 0;
}

solución

El número 15 contiene:

  • 9 números de 1 dígito (0 a 9).
  • 6 números de 2 dígitos (10 a 15).

El número 155 contiene:

  • 9 números de 1 dígito (0 a 9).
  • 90 números de 2 dígitos (10 a 99).
  • 56 números de 3 dígitos (100 a 155).

El número 1555 contiene:

  • 9 números de 1 dígito (0 a 9).
  • 90 números de 2 dígitos (10 a 99).
  • 900 números de 3 dígitos (100 a 999).
  • 556 números de 4 dígitos (1000 a 1555).

Supongo que te haces a la idea.


Así que el sumatorio de los dígitos de todos los números entre A y B se podría calcular así:

int numero;
std::cin >> numero;

int digitos = 0;
int iteracion = 1;
int longitud = 1;

for (int valor = numero; valor >= 10; valor /= 10, iteracion *= 10, ++longitud)
    digitos += ((9 * iteracion) * longitud);

digitos += (((numero % iteracion) + 1) * longitud);

A cada vuelta del bucle dividimos el valor por 10 y seguimos dividiendo mientras no hayamos consumido todos los dígitos salvo el último. También multiplicamos la iteración por 10 para que sea 1 en la primera vuelta 10 en la segunda 100 en la tercera (etc…) y la longitud de los números aumenta también a cada vuelta.

Por lo tanto, suponiendo el valor 155, en la primera vuelta:

  • valor es 155, iteracion es 1, longitud es 1:
    • A digitos se le sumará ((9 * 1) * 1) → 9.

En la segunda vuelta:

  • valor es 15, iteracion es 10, longitud es 2:
    • A digitos se le sumará ((9 * 10) * 2) → 180.

No habrá una tercera vuelta porque siendo valor igual a 1 se acaba el bucle, así que se hace la última suma (((numero % iteracion) + 1) * longitud):

  • numero es 155, iteracion es 100, longitud es 3:
    • A digitos se le sumará (((155 % 100) + 1) * 3) → 135.

En total 9 + 180 + 135 son 357 dígitos.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *