我正在尝试使用以下代码添加数字。例如,如果我的输入是678,我的输出应该是3。
例如
digital_root(942)
=> 9 + 4 + 2
=> 15 ...
=> 1 + 5
=> 6
package codewars;
public class test {
static int sum(int s)
{
int n=s;
int add=0;
while(n%10 > 0)
{
add=n%10 +add;
n=n/10;
//System.out.println("num is " +n );
}
if(add/10 > 0)
{
System.out.println(add);
sum(add);
System.out.println("if block");
}
return add;
}
public static void main(String[] args)
{
int result= test.sum(678);
System.out.println(result);
}
}
我想递归调用sum函数,直到sum只包含一位数。
答案 0 :(得分:2)
您可以尝试以下代码 -
public class DigitalRoot{
public static void main(String[] args){
System.out.println("Digital Root 9: "+findDigitalRoot(9));
System.out.println("Digital Root 942: "+findDigitalRoot(942));
System.out.println("Digital Root 1942: "+findDigitalRoot(1942));
System.out.println("Digital Root 1876: "+findDigitalRoot(1876));
}
public static int findDigitalRoot(int n) {
if(n>10){
int sum = n%10 + findDigitalRoot(n/10);
if(sum>10){
return findDigitalRoot(sum);
}else{
return sum;
}
}else{
return n;
}
}
}
答案 1 :(得分:2)
更接近您自己的算法。虽然不在任何地方使用mod,而是将数字转换为字符串,并在每次传递时将字符的所有数值相加。更容易理解,但可能不那么高效(待测试)。
public class Test{
static int sum(final int s)
{
final String numbers = String.valueOf(s);
final int amountOfDigits = numbers.length();
int sum = Character.getNumericValue(numbers.charAt(0));
for(int i = 1; i < amountOfDigits; i++) {
sum += Character.getNumericValue(numbers.charAt(i));
}
if(sum > 9) {
return sum(sum);
} else {
return sum;
}
}
public static void main(String[] args)
{
int result = Test.sum(678);
System.out.println(result);
}
}
要修复自己的代码,只需添加返回递归调用即可。否则,您总是返回初始数字的所有数字的总和,当您只剩下一个数字时,您只想这样做。
static int sum(int s)
{
int n=s;
int add=0;
while(n%10 > 0)
{
add = (n%10) +add;
n = n/10;
System.out.println("num is " +n );
}
if(add/10 > 0)
{
System.out.println(add);
return sum(add);
}
return add;
}
答案 2 :(得分:1)
这涵盖了内部结果大于10的情况:
static int sum(int s) {
if (s >= 10) {
int t = s % 10 + sum(s / 10);
if (t >= 10) {
return sum(t);
} else {
return t;
}
} else {
return s;
}
}
以下紧凑型函数产生相同的输出:
static int sum(int s) {
if (s < 10) {
return s;
}
return sum(s % 10 + sum(s / 10));
}
答案 3 :(得分:0)
我发现了一个更简单的解决方案,使用关于数字总和的数学关系
static int sum(int n) {
return (n - 1) % 9 + 1;
}
PS:只需在您的控制台中试用即可。
答案 4 :(得分:0)
我已经通过以下方式做到了:
public class DRoot {
public static int digital_root(int n) {
int sum=0;
String s=String.valueOf(n);
for(int i=0;i<s.length();i++){
int a=Character.getNumericValue(s.charAt(i));
sum+=a;
}
if(sum > 9) {
return digital_root(sum);
} else {
return sum;
}
}
}