研究问题是找到已提供数字的数字根。老师为我们提供了数字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);
}
}
答案 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;