0

我需要一些帮助来检查我的程序以找到数字根。如果用户输入 5635,则数字根为 1。要找到数字的数字根,请将数字 5 + 6 + 3 + 5 中的所有数字相加,得到结果 19。然后将结果相加 1 + 9 = 10。然后你加 1 + 0 直到你得到 1,这是你的数字根。

  1. 我有正确的方法还是我对这个问题的方法完全不正确?
  2. 为什么我得到 0 作为结果而不是 1 的正确答案?
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

一些数学告诉你,这只是除以 9 时的余数(我们用 9 替换 0 的余数)。以下适用于n > 0

int root = n % 9;
if (root == 0) root = 9;
于 2013-01-28T09:58:31.923 回答
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 回答
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

使用递归的示例 - 我使用字符串计算数字的总和:它不是很有效,但(稍微)更容易。随意通过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 回答
0

玩chars怎么样?

@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

这是另一个答案中嵌套循环解决方案的两个功能版本,可能更容易理解:

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 回答