这就是我计算整数的数字根的方法。
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));
}
}
答案 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/