Pregunta

¿Cómo manejo enteros grandes en C #?

Tengo una función que me va a dar el producto de divisores:

private static int GetDivisorProduct(int N, int product)
    {
        for (int i = 1; i < N; i++)
        {
            if (N % i == 0)
            {
                Console.WriteLine(i.ToString());
                product *= i;
            }
        }

        return product;
    }

La función de llamada es GetDivisorProduct(N, 1)

Si el resultado es mayor que 4 dígitos, que debe obtener sólo los últimos 4 dígitos. (Por ejemplo, si le doy una entrada de 957, la salida es 7493 después de recortar a cabo sólo los últimos cuatro valores. El resultado real es 876 467 493.).

Otras entradas de muestra:. Si reparto 10000, la salida es 0

La clase BigInteger ha sido retirado de la biblioteca de C #!

¿Cómo puedo obtener los últimos cuatro dígitos?

¿Fue útil?

Solución

Si sólo está buscando en los últimos cuatro dígitos, que no es necesario nada más grande que un entero. Considere lo siguiente:

Al multiplicar dos números, si sólo está interesado en los dígitos menos significativos (es decir, los últimos cuatro dígitos) y los superiores dígitos más no tendrán un efecto en dígitos más bajos de los resultados ... lo que sólo puede " tirar " (el lado derecho) dígitos más significativos antes de multiplicar .

Por ejemplo: Quiero multiplicar dos números grandes, pero sólo necesito los dos últimos dígitos:

int num1 = 123456789;
int num2 = 987654321;

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS

pero si multiplicamos sólo los últimos dos dígitos ...

int result = (num1 % 100) * (num2 % 100);  // result = 89 * 21

89 * 21 = 1869 (los dos últimos dígitos son todavía " 69 " pero no han desbordado ).

I usado esta técnica para calcular el seis dígitos más a la derecha de 1.000.000 factorial.

Otros consejos

Bueno, puede modificar su código como el siguiente:

    for (int i = 1; i < N; i++)
    {
        if (N % i == 0)
        {
            Console.WriteLine(i.ToString());
            product *= i;
        }
        if (product > 10000 * N)
        {
            product %= 10000;
        }
    }

Esto es porque los cuatro últimos dígitos de (10000 * k + l) R son los mismos que para l R. El tipo real de producto depende de la gama de N del que desea manejar. Si se trata de todo tipo entero, entonces el producto debe ser largo.

Por cierto, ¿por qué se pasa el producto como un parámetro, si es siempre 1?

¿Qué hay de tratar de utilizar un doble o larga en lugar de int para el producto? Es sólo funcionaría en algunos casos, pero permitiría que le permite trabajar con números más grandes que ha podido.

Espero que no Missunderstood, pero que desea escribir en la consola de "0000" si el resultado es 0? ¿Has probado:

Console.WriteLine(i.ToString().PadLeft(4,"0")); 

Si lo que desea es obtener el número 0000 como un int Lo siento, pero no saben cómo conseguirlo.

Si no puede ir a .NET 4.0 en este momento, puede utilizar BigInteger de la biblioteca # J desde C #. He aquí un artículo que describe cómo . Lo hace el despliegue de impacto como sea necesario para implementar el J # re-distribuibles .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top