2009-06-29 15 views
1

これは、整数のデジタルルートを計算する方法です。デジタルルートを計算すると、より良い方法はありますか?


import acm.program.*; 

public class Problem7 extends ConsoleProgram 
{ 
    public void run() 
    { 
     println("This program calculates the digital root of an interger."); 

     int num = readInt("Enter the number: "); 
     int sum = 0; 
     while (true) 
     { 
      if (num > 0) 
      { 
       int dsum = num % 10; 
       num /= 10; 
       sum += dsum; 
      } 
      else if (sum > 9) 
      { 
       int dsum = sum % 10; 
       sum /= 10; 
       sum += dsum; 

      } else if (sum <= 9) break; 
     } 
     println("Digital Root is: " + sum); 
    } 

プログラムが正常に動作します。

数値のデジタルルートを計算する方法が改善されていますか? ?


EDIT /コメントを追加しました:ここにTylerの答えを使用して、上記の問題の実装である、それは同様に動作します


import acm.program.*; 

public class Problem7 extends ConsoleProgram 
{ 
    public void run() 
    { 
     println("This program calculates the digital root of an interger."); 

     int num = readInt("Enter the number: "); 
     println("Digital Root of " + num + " is: " + (1 + (num - 1) % 9)); 
    } 
} 

答えて

13
#include <stdio.h> 

int main(void) 
{ 
    int number; 
    scanf("%d", &number); 

    printf("The digital root of %d is %d.", number, (1 + (number - 1) % 9)); 
} 

が、私はこれは私がこのプログラムを書くだろうかあるRamans'は、式を見つけることができなかったら...:コンパイルした後

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
{ 
    int c; 
    int number = 0; 
    while ((c = getchar()) != EOF) 
    { 
     if (isdigit(c)) 
      number += (c - '0'); 
    } 
    if (number <= 9) 
    { 
     printf("The digital root is %d\n", number); 
    } 
    else 
    { 
     printf("%d", number); 
    } 

} 

へ基本的には、これらを連鎖させるだけです。私はあなたが整数のために必要とするかもしれない最大のものが4つだと信じています。

$ echo 829382938 | ./digitalroot | ./digitalroot | ./digitalroot | ./digitalroot 
+0

Googleを検索したとき、私はこれを見つけました(1 +(number-1)%9)。病気を試してみてください。 –

+1

宿題の場合、あなたはその魔法の数式を証明して説明する必要があります。 – Thilo

+0

これは素晴らしいですが、人々はどのようにそのような藻類を出すのですか? –

0

私は入力を取ります代わりにStringとして返します。この方法で、単にStringをループし、Integer.parseInt()を使用して各数値を取得して追加することができます。その番号を再度文字列に変換し、コードをループしてデジタルルートを取得することができます。個人的に

public void run() 
{ 
    println("This program calculates the digital root of an interger."); 

    String num = readLine("Enter the number: "); 
    int sum = 10; 
    while (num > 9) { 
     for (int x = 0; x < num.length(); x++) { 
     sum = Integer.parseInt(num.charAt(x)); 
     } 
     num = Integer.toString(sum); 
    } 
    println("Digital Root is: " + sum); 
} 
2

、私は基本的に2つのループ(第1の和の桁の上に行く、その後、元の数字の上に行くには)一つにマッシュされ、あなたのループを、好きではありません。どのように再帰の散水について:

private int sumDigits(int in){ 
    if (i>10) 
     return in%10 + sumDigits(in/10); 
    return in; 
} 

private int digitalRoot(int in){ 
    assert (in > 0) ; 
    while (in > 9) in=sumDigits(in); 
    return in; 
} 
+0

おかげで、私はまだJavaのプログラミングでは初心者です、私はまだ –

+0

教師は再帰を愛する再帰を学んでいない... – Thilo

+0

再帰章では、私の本の中で最後のものです悲しいことに教師はそれを教えてくれません。私は自分でそれを通過する必要があります。 –

1

私はクラスの同じポイントにいると思いますが、再帰や適度に高度なアイデアはありません(私は超初心者です)。私はウルフラムアルファは素晴らしいです

public void run() { 
    println("This program finds the digital root of an integer."); 
    int n = readInt("Enter a positive integer: "); 
    int dsum = 0; 
     while (n>0) { 
      dsum += n % 10; 
      n /= 10; 
      if ((n==0) && (dsum>9)) { 
       n = dsum; 
       dsum = 0; 
      } 
     } 
    println("The digital root of the integer is " + dsum); 
} 
1
public static void main(String[] args) 


{ 
int n; 
Scanner scan=new Scanner(System.in); 
System.out.println("Enter the no. of which you want to find the digital root"); 
n=scan.nextInt(); 
System.out.println(n%9); 
} 
+2

あなたの答えをもう少し説明できますか? – Jimbou

+0

これは9の倍数では機能しません。 18%9 = 0 – Aschente

0

を使用しました。それはかなりのスプーンが私に以下のソリューションを与えました:

int getDigitalRoot(int n, int base){ 
     return (1+(n-1)%base); } 

int getDigitalRoot(int n){ 
     return (1+(n-1)%9); } 

これはO(1)解決策であり、ループも再帰も必要ありません。

関連する問題