4 votos

Encontrar el número total de ceros en un determinado rango de números decimales

Podría alguien por favor decirme lo que podría ser la función matemática para obtener el número de ceros en la representación decimal de los números? Me rasqué la cabeza en Combinación y Permutación, pero no podía llegar con el genérico de respuesta. El número de longitud puede ser de hasta 1000 dígitos, por lo que puede representar un número como una Cadena.

Por ejemplo, si los números de gama se $1-100$, la respuesta debería ser$11$$1-200$,$20$! Ahora, ¿cómo encontrar el número total de ceros entre el $1-19447494833737292827272\cdots 444$ ( o cualquier número grande)?

Gracias.

8voto

Lorin Hochstein Puntos 11816

Digamos que usted está escribiendo todas las $d$ números de dos dígitos, escribir los ceros a la izquierda. A continuación, habría que escribir $d\times 10^d$ total de dígitos, con cada uno de los dígitos que ocurre exactamente $\frac{1}{10}$th el tiempo, así que habría que escribir un total de $d\times 10^{d-1}$ ceros.

Así, por ejemplo, para escribir todos los números entre el$0$$99$, la escritura de los números menos de $10$$0d$, habría que escribir $2\times 10^2 = 200$ dígitos, de los cuales, $2\times 10=20$ son ceros.

Por supuesto, de estos que no quieren contar el líder de $0$s de $00-09$, por lo que restar $10$; y usted no desea contar el segundo$0$$00$, por lo que resta otro uno, dando un total de $9$ ceros. Por lo que necesita para ajustar la cuenta.

Si usted escribe todos los números de hasta el $d$ dígitos, entonces el número de $0$s, incluyendo las principales $0$s,$d\times 10^{d-1}$. Luego de restar el número de $0$s que aparecen en la parte izquierda del dígito de más (hay $10^{d-1}$ de ellos), los que aparecen en la segunda-a la izquierda-la mayoría de los dígitos cuando más a la izquierda es $0$ (hay $10^{d-2}$ de ellos); los que aparecen en la tercera a la izquierda del dígito cuando los dos primeros se $0$ (hay $10^{d-3}$ de ellos) y así sucesivamente. Así que usted consigue $$d\times 10^{d-1} - (1+10+10^2+\cdots + 10^{d-1}) = \frac{(9(d-1)-1)10^{d-1} + 1}{9}.$$ Así, por ejemplo, para $d=2$ ($1$ a través de $99$), se obtiene $$\frac{(9-1)10^1 + 1}{9} = \frac{81}{9} =9,$$ igual que el anterior. Para $d=3$, (de $1$ a través de$999$), se obtiene $$\frac{(9(2) - 1)10^2 + 1}{9} = \frac{1701}{9} = 189.$$

Lo que si estás haciendo algo ligeramente diferente, como escribir, decir, sólo los números entre el$1$$751$?

Usted puede contar los ceros de $1$ $99$anterior.

Contar el número de ceros en los números de la forma$7bx$$1\leq b\leq 5$. Hay uno para cada valor de $b$, para un total de $5$.

Contar el número de ceros en los números de la forma$70x$; $11$ de ellos.

Contar el número de ceros en los números de la forma$axy$$1\leq a\leq 6$; $10^{2-1}=10$ de ellos (que son simplemente contando todos los ceros en números de hasta 2 dígitos, contando líder de $0$s).

Así que después de contar todo el camino a $99$, a continuación, añadir:

  1. Un cero para cada número $7bx$, $1\leq b\leq 5$: total, $5$ (el dígito central de $751$).
  2. Ceros para cada número $70x$; total, $11$.
  3. Ceros para cada número$axy$$1\leq a\leq 6$; total, $6\times 10^{2-1} = 60$.

Hay 9 ceros de $1$ a través de $99$; y de ahí se $60+11+5=76$ ceros de $100$ a través de $751$, para un total de $85$ ceros de $1$ a través de $751$.

3voto

NeedHack Puntos 1839

El enfoque es correcto, pero la respuesta es incorrecta. Hay 145 ceros de 1 a 751: 9 ceros de 1 a 99, 120 ceros de 100 a 699 (20 x 6) y 16 ceros de 700 a 759

Total: 9+120+16 = 145.

0voto

SeeGee Puntos 1

Hay un buen algoritmo para hacer este cálculo, que se explica aquí.

Si $x$ es el número de los que tenemos, $f(x)$ es el número de ceros que aparecen en el intervalo de $1..x$. Mediante un sencillo programa podemos calcular el $f(x)$ para algunos valores pequeños para detectar un patrón.

public int CountZerosInRangeOneTo(int end)
{
    return Enumerable.Range(1, end)
        .Select(i => i.ToString())
        .SelectMany(s => s.ToCharArray())
        .Count(c => c == '0');
}

Por ejemplo:

f(5    ) =     0
f(52   ) =     5
f(523  ) =   102
f(5237 ) =  1543
f(52378) = 20667

Si $y$ es el nuevo single número de dígitos que se agregan al final de cada tiempo, aparecen las siguientes es verdadera:

$f(10x + y) = 10 \cdot f(x) + x$

Por ejemplo, si $x = 523$, $y = 7$, y $f(x) = 102$, entonces:

$f(10 \cdot 523 + 7) = f(5237) = 10 \cdot f(x) + x = 10 \cdot 102 + 523 = 1543$

Fantástico. Sin embargo, cuando este se rompe es cuando $x$ contiene ceros en sí. Por ejemplo:

f(3    ) =     0
f(30   ) =     3 correct
f(302  ) =    53 incorrect, expected    60, a difference of 7, or 9 - y
f(3020 ) =   823 incorrect, expected   832, a difference of 9, or 9 - y
f(30207) = 11246 incorrect, expected 11250, a difference of 4, or 2 * (9 - y)

Si $g(x)$ es el número de ceros en el número de $x$, entonces podemos modificar nuestra fórmula como esta:

$f(10x + y) = 10 \cdot f(x) + x - g(x) \cdot (9 - y)$

Y que tiene sentido. Si $x = 3020$ $y = 7$ e no $9$, que es dos menos de los números en la final de la secuencia con dos ceros cada uno.

Entonces, ¿cómo esta fórmula ayuda? Bien para una muy grande $x$ con miles de dígitos podemos ir de izquierda a derecha a través de cada dígito y calcular el $f(x)$ como vamos. Aquí un ejemplo de un programa de C# para hacer precisamente eso.

public long CountZerosInRangeOneTo(string end)
{
    long x = 0;
    long fx = 0;
    int gx = 0;

    foreach (char c in end)
    {
        int y = int.Parse(new string(c, 1));
        // Our formula
        fx = 10 * fx + x - gx * (9 - y);
        fx += Modulus; // Avoid negatives
        fx %= Modulus;

        // Now calculate the new x and g(x)
        x = 10 * x + y;
        x %= Modulus;

        if (y == 0)
            gx++;
    }

    return fx;
}

La limitación (en C# de todos modos) es $x$ $f(x)$ va a hacerse muy grandes, por lo que el programa deberá calcular el resultado modulo algún número, o bien utilizar un no-nativo representación integral.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X