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

时间:2009-06-29 07:56:26

标签: java math

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


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

该程序运行正常。

是否有更好/更短的方法来计算数字的数字根。 ?


编辑/添加:以下是使用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));
    }
}

7 个答案:

答案 0 :(得分:15)

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

}

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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);
}

答案 3 :(得分:0)

我会将输入作为字符串而不是。这样,您可以简单地遍历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);
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

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

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

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