Nella sfida del mese scorso ho dovuto evitare di creare una situazione in cui l'errore di overflow potrebbe causare ulteriori complicazioni. In realtà, l'algoritmo per l'espiazione modulare nella base di Miller-Rabin isPrime la routine è scritta per evitare questo problema. Inevitabilmente, incontrerai questo problema indipendentemente dal linguaggio di programmazione. Si verifica un errore di overflow quando si tenta di eseguire un'operazione che richiede più bit di quelli disponibili per rappresentare i risultati. Questo spesso, ma non esclusivamente, si verifica quando si lavora con numeri interi grandi. Ad esempio, prova i seguenti esempi:
//Example 1
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x+i));
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x-i));
//Example 2
n1 = 9007199254740999;
n2 = 1;
Print(n1-n2);
2 53 è il numero intero più grande che JMP può rappresentare prima che si verifichi un overflow. Ecco una bella spiegazione della rappresentazione in virgola mobile (tutti i numeri in JMP sono in virgola mobile). Per la sfida di questo mese, vorrei vederti presentare metodi per aggiungere e sottrarre numeri che traboccerebbero dalla rappresentazione di numeri interi di JMP. Crea due funzioni
- subtractBig ( n1 , n2 ) dove n1 e n2 sono entrambi numeri interi (positivi, negativi o 0) in formato testo. Restituisce un valore in formato testo.
- addBig ( n1 , < n2 >) dove
n1 - numero intero in formato testo o, se n2 è vuoto, un elenco di numeri interi (positivo, negativo o 0) in formato testo.
n2 - intero in formato testo
Restituisce un valore in formato testo.
Esempi:
subtractBig (“9007199254740999”, “9007199254740998”) restituisce “1”
addBig (“9007199254740992”, ”7”) restituisce “9007199254740999”
addBig ({"9007199254740999", "- 1", "11"}) restituisce "9007199254741009"
punteggio :
- 5 punti per una versione di addBig che può 1) aggiungere due numeri di massimo 1000 cifre in meno di 30 secondi e 2) trovare la somma di un elenco contenente al massimo 100 numeri di 100 cifre in meno di 30 secondi. Parte 1) sarà testato con 10 diversi set di numeri. Il numero di cifre in ciascun numero non sarà necessariamente lo stesso. Lo stesso set di 10 verrà utilizzato per tutti gli invii.
- 3 punti aggiuntivi per subtractBig , che deve calcolare (x - y), dove xey sono numeri al massimo di 1000 cifre, in meno di 30 secondi. Verranno utilizzati dieci diversi set di numeri. Il numero di cifre per ciascun numero non sarà necessariamente lo stesso. Lo stesso set di 10 verrà utilizzato per tutti gli invii.
- 3 punti bonus per il addBig invio che può aggiungere correttamente il più grande (numero di cifre) n1 e n2 di uguale lunghezza, in meno di 5 secondi. (2 punti per 2 ND , 1 per il 3 rd )
- 3 punti bonus per il addBig presentazione che può aggiungere correttamente il maggior numero di 1000 cifre in meno di 5 secondi (2 punti per 2 ND , 1 punto per 3 rd ).
- 3 punti extra ciascuno se qualsiasi invio è più veloce o più veloce di qualsiasi invio da parte di un membro dello staff JMP.
La scadenza per la presentazione è alle 23:59 ora di Eastern (USA), lunedì 15 giugno esimo . In bocca al lupo!