SEQUENZE DI KAPREKAR ==================== Dato un numero n in base dieci definiamo il numero next(n) nel seguente modo: sia a il numero ottenuto scrivendo le cifre di n in ordine crescente, sia b il numero ottenuto scrivendo le cifre di n in ordine decrescente. Allora: next(n) = b - a Ad esempio, next(5121) = 4086 Infatti, le cifre che compongono 5121 sono 5, 1, 2, 1, quindi a = 1125 b = 5211 b - a = 5211 - 1125 = 4086. La cosa curiosa e' che, partendo da un numero n di al massimo 4 cifre e applicando ripetutamente la funzione next, si arriva a un punto fisso, ossia viene a un certo punto generato un numero k tale che next(k)=k. Il numero k e' anche detto costante di Kaprekar. La sequenza di Kaprekar generata da n e' data dai numeri ottenuti applicando la funzione next fino al punto fisso k compreso. Ad esempio, la sequenza generata da 5121 e': 5121 4086 8172 7443 3996 6264 4176 6174 Poiche' next(6174)=6174, il numero 6174 e' un punto fisso e la sequenza termina. La sequenza generata da 101 e' 101 99 0 Infatti, next(0)=0. **** Scrivere un programma Kaprekar che legge sulla linea di comando un intero n oppure due interi n e m, dove n e m sono interi positivi aventi al massimo 4 cifre. Se viene dato un solo argomento n, il programma stampa su una riga la sequenza generata da n. Se vengono dati due argomenti n e m, il programma stampa su linee distinte le sequenze generate dai numeri n, n+1, n+2, .... , m. Nel programma devono essere implementati i seguenti metodi statici (la segnatura dei metodi e' scritta in forma incompleta): * next(n) Restituisce il valore di next(n). Usando i metodi disponibili nelle API standard, il metodo non richiede piu' di 10 righe di codice. * stampaSequenza(n) Stampa la sequenza generata da n Esempi ------ Il comando java Kaprekar 86 deve stampare 86 18 63 27 45 9 0 Il comando java Kaprekar 678 deve stampare 678 198 792 693 594 495 Il comando java Kaprekar 8918 8921 deve stampare 8918 7992 7173 6354 3087 8352 6174 8919 8082 8532 6174 8920 9531 8172 7443 3996 6264 4176 6174 8921 8532 6174 ********** Generando tutte le sequenze da 0 a 9999 si nota che: - le costanti di Kaprekar (ultimi numeri delle sequenze) sono solamente 3. - le sequenze non contengono piu' di 8 numeri. Come ulteriore esercizio: - modificare il metodo stampaSequenza in modo che, oltre a stampare le sequenza, restituisca anche la lunghezza della sequenza generata da n - Scrivere un metodo statico conta() che per ogni L=1,..8, stampa quante sono, fra le sequenza generate dai numeri da 0 a 9999, quelle di lunghezza L. - Modificare il metodo main in modo che se non vengono scritti argomenti sulla linea di comando esegue il metodo conta. Le sequenze lunghe 1 sono 3 (sequenze generate dalle costanti di Kaprekar), la maggior parte delle sequnze (2386) ha lunghezza 4. ******* Con numeri aventi piu' di 4 cifre, le sequenze possono non avere un punto fisso, ma possono generarsi dei cicli. Per ulteriori approfondimenti sulle sequenze di Kaprekar vedere ad esempio http://mathworld.wolfram.com/KaprekarRoutine.html