Domanda

Come faccio a gestire grandi numeri interi in C #?

Ho una funzione che mi darà il prodotto dei divisori:

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 funzione di chiamata è GetDivisorProduct(N, 1)

Se il risultato è più grande di 4 cifre, che deve ottenere solo le ultime 4 cifre. (Ad esempio, se do un ingresso 957, l'uscita è 7493 dopo la rifilatura su solo gli ultimi quattro valori. Il risultato attuale è 876.467.493.).

Altri ingressi campione:. Se do 10000, l'uscita è 0

La classe BigInteger è stato rimosso dalla libreria C #!

Come posso ottenere le ultime quattro cifre?

È stato utile?

Soluzione

Se si sta solo guardando le ultime quattro cifre, non avete bisogno di qualcosa di più grande di un numero intero. Considerate questo:

Quando moltiplicare due numeri, se siete interessati solo nelle cifre meno significative (cioè le ultime quattro cifre), quindi le superiori la maggior parte delle cifre meno non avranno un effetto in cifre più basse del risultato ... quindi si può solo " buttare fuori " le più significative cifre (a destra) prima che si moltiplica .

Ad esempio: voglio moltiplicare due grandi numeri, ma ho solo bisogno le ultime due cifre:

int num1 = 123456789;
int num2 = 987654321;

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

, ma se moltiplichiamo solo le ultime due cifre ...

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

89 * 21 = 1869 (le ultime due cifre sono ancora " 69 ", ma noi non hanno traboccato ).

Ho usato questa tecnica per calcolare il sei più a destra cifre di 1.000.000 fattoriale .

Altri suggerimenti

Bene, è possibile modificare il codice in questo modo:

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

Questo perché le ultime quattro cifre (10000 * k + l) R sono gli stessi per l R. Il tipo effettivo di prodotto dipende dalla gamma di N di che si desidera gestire. Se è tutto tipo integer, quindi prodotto dovrebbe essere lunga.

A proposito, perché si passa prodotto come parametro, se è sempre 1?

Che ne dite di provare ad usare un letto matrimoniale o lunga, invece di int per il prodotto? Che avrebbe funzionato solo in alcuni casi, ma permetterebbe di lavorare con numeri più grandi che hai potuto.

Spero non mi missunderstood, ma voglio scrivere in console "0000" se il risultato è 0? Hai provato:

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

Se quello che vuoi è quello di ottenere il numero 0000 come un int Mi dispiace, ma non sanno come farlo.

Se non si può andare a .NET 4.0 in questo momento, è possibile utilizzare BigInteger dalla libreria J # da C #. Ecco un articolo che descrive come . Lo fa distribuzione impatto è necessario distribuire il J # ridistribuibile .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top