2015-08-23 13 views
7

Ich bin ein Anfänger Java und versucht, kniffliges ProblemSumme von Ziffern, bis die Summe ist eine einstellige Zahl

Eingang zu lösen = 777
Ausgang 3
7 + 7 + 7 = 21, sollte 2+ 1 = 3;
Aus dem obigen Code, wenn meine Eingabe 333 ist, bekomme ich 9 als Antwort, aber wenn die Summe zwei Ziffern ist (777 = 21), werde ich leer!

public static void main(String[] args) 
{ 

    int y=333;//if y is 777 i am getting blank 
    int sum=0; 
    String s; 
    char []ch; 
    do 
    { 
     s=String.valueOf(y); 
     ch=s.toCharArray(); 

     if(ch.length>1) 
     { 
      for(int i=0;i<ch.length;i++) 
      { 
      sum+=Character.getNumericValue(ch[i]); 
      } 
     } 
     else 
     { 
     System.out.println(sum); 
     } 
     y=sum;  

    }while(ch.length>1); 

} 
+3

Dies ist einer jener Fälle, in denen eine rekursive Lösung wäre besser. Auch dies kann ohne die rechenintensive Umwandlung in eine Zeichenfolge gelöst werden. Hinweis; verwenden Modulo und Integer-Division durch 10. – Bathsheba

+0

@batsheba tatsächlich Modulo 9 Werke noch besser (für dezimal, für binäre würden Sie verwenden Modulo 1) –

Antwort

5

Code vielleicht Schleife für immer

die richtige Lösung ist die folgende unten

public static void main(String[] args) throws ParseException { 
int y = 777;// if y is 777 i am getting blank 
int sum = 0; 
String s; 
char[] ch; 
do { 
    sum = 0; 
    s = String.valueOf(y); 
    ch = s.toCharArray(); 
    if (ch.length > 1) { 
     for (int i = 0; i < ch.length; i++) { 
      sum += Character.getNumericValue(ch[i]); 
     } 
    } else { 
     System.out.println(ch[0]); 
     break; 
    } 
    y = sum; 
} while (ch.length > 1); 
} 

Vielleicht ist die bessere Wahl ist der folgende Code

public static void main(String[] args) throws ParseException { 
    int y = 333;// if y is 777 i am getting blank 
    int sum = 0; 
    while (y % 10 != 0) { 
     sum += y %10; 
     y = y/10; 
     if (0 == y && sum >= 10) { 
      y = sum; 
      sum = 0; 
     } 
    } 
    System.out.println(sum); 
} 

Hoffnung, die

geholfen
2

Sie erhalten, weil Sie die print-Anweisung in anderem Zustand versetzt ..

auch beachten, dass Ihr Summe Wert zurückgesetzt werden, bevor sie ihn erneut verwenden. I.e. Setze Summe = 0 am Anfang der do-Schleife.

EDIT: Es gibt zwei Lösungen, die Sie 1. Wert drucken nicht, dass Sie Anweisungen innerhalb anderer Bedingungen Drucken Sie setzen

  1. Drucken Summe außerhalb des do while-Schleife
3

Für eine Aufgabe wie diese ist es am besten, Rekursion zu verwenden.

Der Workflow in Pseudo-Code würde wie folgt aussehen:

procedure sumTillOneDigit(n) 
    split n into it's digits 
    s := sum of all digits of n 

    if s has more than one digit: 
     sumTillOneDigit(s) 
    else 
     output s 

ich absichtlich dieses Pseudo-Code in schriftlicher Form bin, da dies sollte Ihnen helfen, die Aufgabe zu lösen. Ich werde Ihnen keine Java-Implementierung geben, da es für mich wie eine Hausaufgabe aussieht.

Weitere Informationen finden Sie unter:

2

Vor allem der Wert der Summenvariable zurückgesetzt muss.

und zweitens müssen Sie s in sonst Bedingung drucken und nicht die Summe und Ruhe ist fein.

public static void main(String[] args) 
{ 

    int y=333;//if y is 777 i am getting blank 
    int sum; 
    String s; 
    char []ch; 
    do 
    { 
     sum=0; 
     s=String.valueOf(y); 
     ch=s.toCharArray(); 

     if(ch.length>1) 
     { 
      for(int i=0;i<ch.length;i++) 
      { 
      sum+=Character.getNumericValue(ch[i]); 
      } 
     } 
     else 
     { 
     System.out.println(s); 
     } 
     y=sum;  

    }while(ch.length>1); 

} 
2

Ich denke, deine Lösung hat falsche Grundlagen. Es gibt keinen Grund, Ihre Nummer in String zu konvertieren und dies als Char-Array zu behandeln. Sie tun zu viele unnötige Operationen.

Sie können einfacher tun, wenn Sie mit Zahlen bleiben.

Sie können es Rekursion tun:

public static int sumRec(int number){ 
    if (number<10){ 
     return number; 
    } 
    int sum = 0; 
    while(number!=0){ 
     sum += number %10; 
     number /= 10; 

    } 
    return sumRec(sum); 
} 

oder itteration

public static int sumIt(int number){ 
    while(number>=10){ 
     int sum = 0; 
     while(number!=0){ 
      sum += number %10; 
      number /= 10; 
     } 
     number = sum; 
    } 
    return number; 
} 

es ist viel einfacher, nicht wahr?

+0

Ich bin damit einverstanden sein viel einfacher, aber wenn Sie die Logik zum ersten Mal zu lösen, wie wud Weißt du, dass du/mod um 10 teilen musst? Ich bin sehr schlecht in Mathe :) –

2

Sie können dies durch 1 Zeile lösen:

public static int sumDigits(int n) { 
    return (1 + ((n-1) % 9); 
    } 

Zum Beispiel: Eingang 777 -> Rückkehr 1 + ((777-1) % 9) = 3

kann auch mit negativer Zahl arbeiten.

1

rekursive Variante

public static int myFunction(int num){ 
    if(num/10 == 0){ 
     return num; 
    } 

    int digitSum = num%10 + myFunction(num/10); 

    if(digitSum/10 == 0){ 
     return digitSum; 
    } 

    return myFunction(digitSum); 
} 
Verwandte Themen