2009-06-06 6 views
6

Come gestisco i numeri interi grandi in C#?Gestione di interi "grandi" 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 chiamante è GetDivisorProduct(N, 1)

Se il risultato è più grande di 4 cifre, dovrei ottenere solo le ultime 4 cifre . (Ad esempio, se fornisco un input di 957, l'uscita è 7493 dopo aver eliminato solo gli ultimi quattro valori. Il risultato effettivo è 876467493.).

Altri ingressi di esempio: Se io do 10000, l'uscita è 0.

La classe BigInteger è stato rimosso dalla libreria C#!

Come posso ottenere le ultime quattro cifre?

+0

vedere la domanda relativa: http://stackoverflow.com/questions/959923/handle-big-integers-in-c –

+3

Vuoi dire vedere la stessa domanda? – heavyd

risposta

27

Se stai guardando solo le ultime quattro cifre, non hai bisogno di nulla più grande di un numero intero. Considerate questo:

Quando moltiplicare due numeri, se siete interessati solo nelle cifre significative meno (vale a dire le ultime quattro cifre), quindi le superiori la maggior parte delle cifre meno non avranno un effetto sulle cifre più basse del risultato. .. così puoi semplicemente "buttare fuori" le cifre più significative (lato destro) prima di moltiplicare.

Per 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 "" ma non hanno traboccato).

Ho utilizzato questa tecnica per calcolare il Six Right-Most Digits of 1,000,000 factorial.

godere,

Robert C. Cartaino

+7

Sì. aritmetica modulare: (a * b)% m == ((un% m) * (b% m))% m –

+0

Questo è un modo molto più conciso di spiegare il mio esempio prolisso . –

0

Che ne dici di provare a utilizzare un prodotto doppio o lungo anziché int? Funzionerebbe solo in alcuni casi, ma ti permetterebbe di lavorare con numeri più grandi che sei stato in grado di fare.

+0

Ho già provato con doppio, lungo ecc. Con lo stesso risultato. –

+0

Scusate, non potrei essere più d'aiuto! In bocca al lupo! – Pwninstein

7

.NET 4.0 ha un BigInteger classe

+0

dolce - non sapeva di classe BigInteger! – TWith2Sugars

+2

L'OP non dovrebbe usare affatto BigInteger. Vedi la risposta di Robert. –

0

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 è ottenere il numero 0000 come int mi dispiace, ma non so come ottenerlo.

+0

Ho fatto in questo modo .. ma non è affatto una soluzione fattibile. Pensi che è davvero? –

1

Beh, è ​​possibile modificare il codice come questo:

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 del (10000 * k + l) R sono gli stessi che per l R. Il tipo effettivo del prodotto dipende dalla gamma di N che si desidera gestire. Se è tutto di tipo intero, il prodotto dovrebbe essere lungo.

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