查找数字的数字根

时间:2012-10-24 06:26:53

标签: java math

研究问题是找到已提供数字的数字根。老师为我们提供了数字2638.为了找到数字根,你必须分别添加每个数字2 + 6 + 3 + 8 = 19.然后你取结果19并将这两个数字加在一起1 + 9 = 10再做同样的事情1 + 0 = 1.数字根是1.

我的第一步是使用变量total将数字2638加起来找到总数为19.然后我尝试使用第二个while循环来使用%

我必须尝试使用​​基本整数运算(+, - ,*,/)来解决问题。
1.使用嵌套while循环是否有必要或可能解决问题?
我的数学是否正确?
正如我在这里写的那样,它不能在Eclipse中运行。我正确使用了while循环吗?

import acm.program.*;


public class Ch4Q7 extends ConsoleProgram {
   public void run(){
      println("This program attempts to find the digit root of your number: ");

      int n = readInt("Please enter your number: "); 

      int total = 0;

      int root = total;


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

    }   

   while ( total > 0 ){
     root = total; 
     total = ((total % 10) + total / 10); 
    }


     println("your root should be " + root);
}

}

7 个答案:

答案 0 :(得分:1)

我认为它确实有效,但有点太多了: - )

total = ((total % 10) + total / 10); 

无法收敛到0.此外,您的程序将只处理非常具体的情况。正如其他人指出的那样,这可以递归地解决,但也只需要一个双循环。像你尝试过的一系列循环都行不通。

试试这个(在输入变量上与你的程序相同,它实际上是你的两个循环的插件替换):

    do {
        while (n > 0) {
            total = total + (n % 10);
            n = (n / 10);
        }
        n = total;
        total = 0;
    } while (n > 9);  // need at least 1 more loop

在此循环之后,n将包含根号。

答案 1 :(得分:1)

在获得一位数字之前,您只能将最后一位数相加:

public static int getRoot(int n) {
    int root=n;
    while ( (root=((root%10) + root/10))>9  );
    return root;
}  

或者使用递归:

public static int recursionGetRoot(int n) {
    if(n<10)
        return n;
    return n%10 + recursionGetRoot(n/10);
}  

答案 2 :(得分:1)

递归解决方案:

public static void main(String[] args)
{
    System.out.println(getDigitRoot(1));
    System.out.println(getDigitRoot(11));
    System.out.println(getDigitRoot(1924));
    System.out.println(getDigitRoot(2638));
}

public static int getDigitRoot(int n)
{
    if (n < 10)
    {
        return n;
    }
    int sum = 0;
    while (n > 0)
    {
        sum += n % 10;
        n = n / 10;
    }
    return getDigitRoot(sum);
}

输出:

1
2
7
1

我对这一次的递归有两种想法。它更紧密地遵循您在手动解决它时所做的事情,因此这是有道理的,但是迭代实现并不像往常那样更难以扩展。我认为在大多数情况下它并不重要,因为性能不太可能是关键的,你不太可能处理大到足以导致递归问题的数字。

答案 3 :(得分:0)

循环检查您的号码是否大于或等于10,即它有多个数字。在内循环中添加数字。打印中间结果以检查数学是否正确,即打印您提取的数字和总和。如果您愿意,可以稍后删除。当你的号码小于10时,就有你的根。

答案 4 :(得分:0)

你为什么不亲自测试?这是编写一些测试的一种非常简单的方法(例如实际结果和预期结果之间的比较),如果所有这些测试都通过,则数学是正确的。

首先我们需要在一个单独的方法中提取数学,因为我们需要一些需要输入并提供输出的东西:

public void run(){
  println("This program attempts to find the digit root of your number: ");

  int n = readInt("Please enter your number: "); 

  int root = calculateRoot(n);    

  println("your total should be " + root);
}

public static int calculateRoot(int n) {
  int total = 0;
  int root = total;
  while (n > 0 ){
    total = total + (n %10);
    n = (n / 10);
  }   

  while ( total > 0 ){
    root = total; 
    total = ((total % 10) + total / 10); 
  }

  return root;
}

有了这个,我们可以创建一个main方法来执行一些测试:

public static void main(String[] args) {

  if (0 == calculateRoot(0)) {
    System.out.println("0: OK");
  }

  if (1234 == calculateRoot(10)) {
    System.out.println("1234: OK");
  }

  // and so on

}

因此,只需实现您的算法并执行类并通过输出验证所有测试都可以。这是非常简化的,稍后您将使用特殊的测试工具,但一般方法将是相同的:定义一些测试用例和代码,直到所有实现都通过所有测试。

答案 5 :(得分:0)

2.我的数学是否正确? Yes 正如我在这里写的那样,它不能在Eclipse中运行。我正确使用了while循环吗? No 1.使用嵌套while循环是否有必要或可能解决问题?

是的,可以使用嵌套循环作为上面的fvu给出的答案

do {
    while (n > 0) {
        total = total + (n % 10);
        n = (n / 10);
    }
    n = total;
    total = 0;
} while (n > 9); 

是否有必要使用嵌套循环。 No你可以使用递归

public static void run(){
      System.out.println("This program attempts to find the digit root of your number: ");

      //int n = 234567; 

      int total = 23456;

    //  int root = total;


          total=Test.calctotal(total);

      System.out.println("Root:"+total);
}
public static int calctotal(int n)
{
    int total=0;
    System.out.println(n);
    if(n>9)
    {
        while (n > 0 ){
            total = total + (n %10);
            n = (n / 10);
        }  
        total=Test.calctotal(total);
    }
            else
                total=n;
    return total;
}

答案 6 :(得分:0)

  int root = 0;
  int t = 0;

  while (true)
  {
    root = root + (n %10);
    t = n/10;
    n = t;

    if(t == 0)
    {
        if(root < 10)
            break;

        n = root;
        root = 0;
    }
}   

甚至更简单

int root = 0;

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

if((root == 0) || (root%9 != 0))
    root = root%9;
else
    root = 9;