2015-08-23 42 views
7

Jestem java początkujący i próbuje rozwiązać trudne problemusuma cyfr till suma jest jednocyfrowy numer

wejście = 777
wyjście powinno być 3
7 + 7 + 7 = 21, 2+ 1 = 3;
Z powyższego kodu, jeśli moje dane wejściowe to 333, otrzymuję 9 jako odpowiedź, ale kiedy suma składa się z dwóch cyfr (777 = 21), otrzymuję pustkę!

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

Jest to jeden z tych przypadków, gdzie rekurencyjny rozwiązanie byłoby lepsze. Można to również rozwiązać bez kosztownej konwersji sygnału na ciąg. Wskazówka; używaj modulo i dzielenia całkowitoliczbowego przez 10. – Bathsheba

+0

@batsheba faktycznie, modulo 9 działa jeszcze lepiej (dla dziesiętnych, dla binarnego używałbyś modulo 1) –

Odpowiedz

5

kod może pętla zawsze

właściwym rozwiązaniem jest następujący poniżej

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); 
} 

Być może lepszym rozwiązaniem jest następujący kod

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); 
} 

nadzieję, że pomogło

2

Otrzymujesz że ponieważ można umieścić oświadczenie drukowania w warunkach innego ..

Należy również pamiętać, że aby zresetować sumy wartości przed ponownym użyciem. To znaczy. Ustaw sumę = 0 na początku pętli do.

EDIT: istnieją dwa rozwiązania do drukowania, które cenią 1. Nie umieszczaj drukowania sprawozdań wewnątrz indziej warunkach

    sumę
  1. Print poza robić podczas pętli
3

Do takich zadań najlepiej jest używać rekurencji.

Workflow w Pseudokod wyglądałby następująco:

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 

ja celowo piszę to w Pseudokod, ponieważ powinno to pomóc rozwiązać zadanie. Nie dam ci implementacji Java, ponieważ wygląda mi to na zadanie domowe.

Aby uzyskać więcej informacji, patrz:

2

Przede wszystkim należy przywrócić wartość zmiennej sum.

i po drugie musisz wydrukować s w innym stanie, a nie suma i reszta to dobrze.

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

Myślę, że twoje rozwiązanie ma złe podstawy. Nie ma sensu konwertować numeru na ciąg i traktować go jako tablicy znaków. Robisz zbyt wiele niepotrzebnych operacji.

Możesz zrobić jest prostsze, jeśli trzymasz się liczb.

Można to zrobić za pomocą rekurencji:

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); 
} 

lub 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; 
} 

Jest o wiele prostsze, prawda?

+0

Zgadzam się o wiele prostsze, ale kiedy rozwiązujesz logikę po raz pierwszy jak wud wiesz, że musisz podzielić/mod przez 10? Jestem bardzo źle z matematyki :) –

2

Problem ten można rozwiązać przez 1 linia:

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

Na przykład: Wejście 777 -> powrót 1 + ((777-1) % 9) = 3

może również współpracować z liczby ujemnej.

1

Recursive wariant

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); 
}