Solo un promemoria. Stasera scade la scadenza per le iscrizioni alla Sfida 3.
Forse vale la pena fare chiarezza perché crea un po' di confusione. Entrambe le funzioni (ed entrambi i casi per aggiungiBig ) dovrebbe essere in grado di gestire numeri di diverse lunghezze e segni. Lo proverò. Nel determinare i punti bonus di velocità e dimensione, utilizzerò numeri della stessa lunghezza.
Assistente
Ho letto di nuovo la descrizione della tua sfida ieri sera e penso che tu fornisca una spiegazione chiara dei requisiti.Sentiti libero di ignorare le mie domande.Mi spiace!
-Dave
In risposta alla mia domanda, ho appena letto il tuo terzo esempio, questo suggerirebbe (io) che non possiamo supporre che tutti i numeri nell'elenco n1 abbiano lo stesso numero di cifre.Anche, (ii) potrebbe essere che l'elenco n1 contenga numeri negativi.Presumibilmente allora (iii) nel caso di due numeri n1 e n2 uno o entrambi potrebbero essere negativi?
Forse puoi semplicemente chiarire i 3 punti che ho menzionato. Grazie.
Nel caso in cui stiamo aggiungendo l'elenco di numeri, possiamo supporre che ciascun numero abbia la stessa lunghezza o è qualcosa che dobbiamo testare? (ovvero dobbiamo gestire il caso generale o solo lo scenario di test che hai descritto?)
Nella sfida del mese scorso, ho dovuto evitare di creare una situazione in cui l'errore di overflow potesse causare ulteriori complicazioni. In effetti, l'algoritmo per l'esponenziazione modulare è basato su Miller-Rabin èPrime la routine è scritta per evitare questo problema. Inevitabilmente, ti imbatterai in 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. Ciò si verifica spesso, ma non esclusivamente, quando si lavora con numeri interi di grandi dimensioni. 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 è l'intero più grande che JMP può rappresentare prima che si verifichi l'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, mi piacerebbe vederti inventare metodi per aggiungere e sottrarre numeri che supererebbero la rappresentazione degli interi di JMP. Creare due funzioni
- sottrarreBig ( n1 , n2 ) Dove n1 E n2 sono entrambi numeri interi (positivi, negativi o 0) in formato testo. Restituisce un valore in formato testo.
- aggiungiBig ( n1 ,< n2 >) dove
n1 – intero in forma testuale o, se n2 è vuoto, un elenco di numeri interi (positivi, negativi o 0) in formato testo.
n2 – numero intero in formato testo
Restituisce un valore in formato testo.
Esempi
sottrarreBig (“9007199254740999”, “9007199254740998”) restituisce “1”
aggiungiBig (“9007199254740992”,”7”) restituisce “9007199254740999”
aggiungiBig ({"9007199254740999","-1","11"}) restituisce "9007199254741009"
Punteggio
- 5 punti per una versione di aggiungiBig 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. Per tutti gli invii verrà utilizzato lo stesso set di 10.
- 3 punti aggiuntivi per sottrarreBig , che deve calcolare (x – y), dove xey sono numeri composti da un massimo di 1000 cifre, in meno di 30 secondi. Verranno utilizzati dieci diversi gruppi di numeri. Il numero di cifre per ciascun numero non sarà necessariamente lo stesso. Per tutti gli invii verrà utilizzato lo stesso set di 10.
- 3 punti bonus per il aggiungiBig 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 3 rd )
- 3 punti bonus per il aggiungiBig presentazione in grado di aggiungere correttamente il maggior numero di numeri da 1000 cifre in meno di 5 secondi (2 punti per 2 nd , 1 punto su 3 rd ).
- 3 punti extra ciascuno se un invio è altrettanto veloce o più veloce di qualsiasi invio da parte di un membro dello staff JMP.
Il termine ultimo per l'invio è lunedì 15 giugno alle 23:59, ora della costa orientale degli Stati Uniti. Buona fortuna!