1

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

我的第一步是使用变量 total 将数字 2638 相加以找到总数 19。然后我尝试使用第二个 while 循环通过使用 % 分隔两位数

我必须尝试通过使用基本整数算术(+、-、*、/)来解决问题。
1.是否有必要或可能使用嵌套的while循环来解决问题?
2.我的数学正确吗?
3. 正如我在这里写的,它不能在 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);
}

}

4

7 回答 7

2

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

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 将包含根号。

于 2012-10-24T06:44:22.590 回答
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);
}  
于 2012-10-24T07:03:03.570 回答
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

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

于 2012-10-24T10:59:44.093 回答
0

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

于 2012-10-24T06:41:35.047 回答
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

}

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

于 2012-10-24T06:44:09.770 回答
0

2.我的数学正确吗?Yes 3. 正如我在这里写的,它不能在 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;
}
于 2012-10-24T07:00:29.977 回答
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;        
于 2012-10-24T07:00:33.500 回答