计算数字根,有更好的方法吗?

这就是我计算整数的数字根的方法。


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 / ADDED:这是使用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)); } } 

 #include  int main(void) { int number; scanf("%d", &number); printf("The digital root of %d is %d.", number, (1 + (number - 1) % 9)); } 

如果我找不到Ramans的公式,我就会写这个程序……:

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

在编译之后,要运行它,基本上你只需将它们链接在一起。 我相信四个是整数你可能需要的最多。

 $ echo 829382938 | ./digitalroot | ./digitalroot | ./digitalroot | ./digitalroot 

就个人而言,我不喜欢你的循环,它基本上是两个循环(首先越过原始数字,然后越过总和的数字)捣碎成一个。 如何递归递归:

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

我认为我在课堂上的同一点,没有递归或任何中等高级的想法(我是一个超级初学者)。 我用了

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

我会把输入作为String而不是。 这样,您可以简单地遍历String并使用Integer.parseInt()来获取每个数字并添加它们。 您可以将该数字再次转换为String并循环访问代码以获取数字根。

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

Wolfram Alpha令人惊叹。 几乎勺子给我提供了以下解决方案:

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

这是一个O(1)解决方案,无需循环或递归。

这是我发现的最适用于所有用例的最短解决方案。

 public int digRoot(int num) { num = 1015; { return (1+(num-1)%9); } } 

参考: https : //dgeekspot.wordpress.com/2015/11/17/digital-root-algorithm/