0

数字のルートを見つけるためにプログラムをチェックするのに助けが必要です。ユーザーが 5635 を入力した場合、数字の根は 1 です。数字の数字の根を見つけるには、5 + 6 + 3 + 5 のすべての数字を足し、19 の結果を取得します。次に、結果 1 + 9 を足します= 10. 次に、数字の根である 1 になるまで 1 + 0 を追加します。

  1. 私は正しいアプローチを持っていますか、それとも質問への私のアプローチは完全にオフですか?
  2. 正解が 1 ではなく、結果が 0 になるのはなぜですか?
import acm.program.*; 

public class DigitRoot extends ConsoleProgram {

    public void run() {
        println("this program attemts to find the digit root a user enters.");

        int n = readInt("please enter any positive integer: ");

        int dsum = 0;
        int sumtotal = 0;
        int threesum = 0;
        int foursum = 0;

        while (n > 0) {
            dsum += n % 10;
            n /= 10;

            if (dsum > 9) {
                sumtotal = (dsum / 10) + (dsum % 10);
            } else if (sumtotal > 9) {
                threesum = (sumtotal / 10) + (sumtotal % 10);
            } else if (threesum > 9) {
                foursum = (threesum / 10) + (threesum % 10);
            } else if (foursum < 9) {
                println("your digit root is" + foursum);
            } else {
                println("this program is borken.");
            }
        }
    }
}
4

6 に答える 6

2

これを試して

int n = 5635;
int total = 0;
do {
    while (n > 0) {
        total = total + (n % 10);
        n = (n / 10);
    }
    n = total;
    total = 0;
} while (n > 9);
System.out.println(n);

または再帰を使用して、

    int n = 5635;
    int total = 0;

    do {
        total = Test.sumofdigit(n);
        n = total;
    } while (total >= 10);

    System.out.println(total);


public static int sumofdigit(int inputnumber) {
    if (inputnumber < 10)
        return inputnumber;
    return sumofdigit(inputnumber / 10) + inputnumber % 10;
}
于 2013-01-28T10:22:21.677 に答える
2

一部の数学では、これは 9 で割った余りであることがわかります (0 の余りを 9 で置き換えます)。以下は に対して機能しn > 0ます。

int root = n % 9;
if (root == 0) root = 9;
于 2013-01-28T09:58:31.923 に答える
1

あなたの論理は非常に複雑なようです..これを試してください

while ( n > 0 ) {
                dsum +=  n % 10;
                n /= 10;
                if(n==0 && dsum >9){
                    n=dsum;
                    dsum =0;
                }

        }
        System.out.println(dsum);
于 2013-01-28T09:56:14.093 に答える
0

キャラクターで遊んでみませんか?

@Test
    public void testGetRoot(){
        int n=3565;
        char[] chars;
        while (n>9){
            int r=0;
            chars = String.valueOf(n).toCharArray();
            for(char c : chars)r+=(c-'0');
            n=r;
        }
        System.out.println(n);
    }

これは1を出力します。

于 2013-01-28T10:17:33.487 に答える
0

これは、おそらく理解しやすい別の回答のネストされたループソリューションの2機能バージョンです。

int digitRoot(int num) {
  // calculate digit root as specified:
  // get sum of digits until there is only one digit, which is the root
  while (num > 9) {
    num = sumOfDigits(num);
  }
  return num;
}

int sumOfDigits(int num) {
  int sum = 0;
  // negative numbers not supported, for them 0 is returned...
  while (num > 0) {
    sum += num % 10; // add least significant digit's value to sum
    num /= 10; // remove the least significant digit from num
  }
  return sum;
}
于 2013-01-28T10:39:49.237 に答える
0

再帰を使用した例 - 文字列を使用して数値の合計を計算します。あまり効率的ではありませんが、(わずかに) 簡単です。n % 10ループで使用して自由に改善してください。

public static void main(String[] args) throws Exception {
    System.out.println(calculateRoot(5635)); //prints 1
}

public static int calculateRoot(int n) {
    int sum = sumFigures(n);
    return sum < 10 ? sum : calculateRoot(sum);
}

public static int sumFigures(int n) {
    String s = String.valueOf(n);
    int sum = 0;
    for (char c : s.toCharArray()) {
        sum += c - '0';
    }
    return sum;
}
于 2013-01-28T10:04:20.137 に答える