2015-08-23 8 views
7

tek haneli = 3
7 + 7 = 21 + 7, 2+ 1 = 3;
Yukarıdaki koddan benim girişim 333 ise 9'u cevap olarak alıyorum ama toplamı iki basamak olduğunda (777 = 21) boş alıyorum!toplamıdır çıkış olmalıdır 777 <br> Yeni başlayan bir Java ve zor sorunu</p> <p>giriş çözmeye çalışıyorum sayısı

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

Bu yinelemeli çözelti daha iyi olur, bu durumda biri. Ayrıca bu, bir dizgeye hesaplama açısından pahalı dönüştürme olmadan çözülebilir. İpucu; modulo ve integer bölümünü 10 ile kullanın. – Bathsheba

+0

@batsheba aslında, modulo 9 daha iyi çalışır (ondalık için; modulo 1'i kullanmak istediğiniz ikili için) –

cevap

5

kodunuzu belki döngü sonsuza

doğru çözüm

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

altında takip ediyor Belki daha iyi bir seçim

yardımcı

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

umut aşağıdaki kodu olan

2

Sen başka durumda baskı deyimi ..

koymak çünkü Ayrıca kullanımından önce sizin toplamı değerini sıfırlamak için dikkat çıkardın. Yani Do döngüsü başlangıcında toplamını = 0 olarak ayarlayın.

DÜZENLEME: Eğer 1.

do-while döngüsünde dışında
  • Baskı toplamı
      Diğer koşullar içindeki ifadeleri baskı koymayın değer yazdırmak için iki çözüm vardır
  • 3

    Böyle bir görev için, yinelemeyi kullanmak en iyi yöntemdir. pseudocode

    iş akışı şu şekilde görünecektir: Ben kasten pseudocode bu yazıyorum

    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 
    

    , bu görevi çözme yardımcı olacaktır çünkü. Bana bir ev ödevi gibi göründüğü için size bir Java uygulaması vermeyeceğim. Daha fazla bilgi için

    bkz: Herşeyden

    2

    Önce toplamı değişkenin değerini sıfırlamak gerekir.

    ve ikincisi, başka bir koşulda yazdırmanız gerekir, toplam ve geri kalan ince.

    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

    Çözümünüzün yanlış temelleri olduğunu düşünüyorum. Numaranızı String'e dönüştürmek ve bunu char dizisi olarak kullanmak için bir nokta yoktur. Çok fazla gereksiz operasyon yapıyorsun.

    Rakamlarla yapışırsanız daha basit yapabilirsiniz.

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

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

    doğru, çok daha basit olan:

    Sen özyinelemeye kullanarak bunu yapabilirsiniz?

    +0

    Çok daha kolay kabul ediyorum ama mantığı ilk kez çözerken 10'a bölünme/modlamaya ihtiyaç duyduğunuzu biliyor musunuz? matematikte çok kötüyüm :) –

    2

    Sen 1 hattı ile bu çözebilir:

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

    : Giriş 777 -> negatif sayı ile çalışabilir Ayrıca 1 + ((777-1) % 9) = 3

    dönün.

    1

    Yinelemeli varyant

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