2016-04-14 12 views
5

Devo costruire un metodo per aggiungere ogni cifra di una stringa data in parametro e così fino a che ci sono solo 1 cifra a sinistra, ad es. 1234 = (1+2+3+4) = 10 = (1+0) = 1.Aggiungi cifra del numero

Inizialmente ho pensato che la chiamata ricorsiva o un ciclo while andrebbe bene. Ma c'è un modo più intelligente? Usando il modulo forse?

1234 % 9 = 1 Questo è sembra funzionare ... Ma no: 9%9 non è uguale a 9 ma è a 0.

C'è un modo per creare questa funzione senza ricorsivo/per/mentre?

+0

lasciate che vi chiedo, perché swould 9% 9 essere 9, di causa è 0 è il modulo (resto) dell'operatore, si cerca di mettere il 9 le volte in 9 come si può, e il resto verrà visualizzato, quindi il 10% 4 sarebbe 2 – ScriptKiddy

+0

Il tuo argomento è in realtà una stringa o un numero? La sua dimensione è arbitraria? –

+0

modulo divide i numeri in classi. 9 e 0 sono nella stessa classe e quindi "uguali tra loro" che significa 0 = 9% 9 = 9. – derlarsschneider

risposta

6

Ho trovato l'algoritmo semplice da qualche parte non molto tempo fa. In realtà con esso funziona con %9, tuttavia è necessario controllare il caso se il modulo di quel numero è uguale 0.

Scommetto esisterebbe più modi per raggiungere il risultato, il codice più semplice sarebbe in Java in questo modo:

int sumAllDigits(int n) { 
    return (n%9 == 0 && n!=0) ? 9 : n%9; 
} 
+0

Non dovrebbe restituire 'n' e non' 9' se 'n% 9 == 0'? –

+0

No, ad esempio perché se l'input è '18' givng' n = 1 + 8 = 9', quindi 'n% 9' equivale a' 0' e il risultato viene restituito come '9'. –

+0

@AyushGupta Come funzionerebbe? 1 + 8 non è 18. – Chris

4

x%9 effettivamente funziona. L'unico problema è quando ottieni 0, non sai se avresti dovuto ottenere 0 o 9. Ma puoi guardare indietro al tuo numero originale per quello: l'unica cosa che può restituire 0 è 0. Quindi:

public int digitSum(int input) { 
    if (input == 0) { 
     return 0; 
    } 
    int ret = input % 9; 
    if (ret == 0) { 
     return 9; 
    } 
    return ret; 
} 
4
int sumAllDigits(int n) { 
    return (n-1)%9 + 1; 
} 

funziona per tutti i n> = 1

1

Ne fanno una stringa quindi calcola il carattere in base al carattere. Se il risultato è maggiore di 9, converti in stringa e ripeti.

public class FakeTest { 

    @Test 
    public void testCalc() { 
     Assert.assertEquals("1234 -> 1", 1, calc(1234)); 
    } 

    private int calc(int value) { 
     String svalue = String.valueOf(value); 
     int sum = 0; 
     for (char c : svalue.toCharArray()) { 
      sum += (c - '0'); 
     } 
     return sum > 9 ? calc(sum) : sum; 
    } 
} 
+0

Stiamo cercando di evitare un loop. E convertire un numero in una stringa in un numero è piuttosto lento. È meglio usare '%'. – Teepeemm

Problemi correlati