数字之和直至成为一位数

7

我是一名Java初学者,正试图解决一个棘手的问题

输入=777
输出应该为3
7+7+7=21,2+1=3;
从上述代码中可以看出,如果我的输入是333,我会得到9作为答案,但当总和是两位数时(777=21),我得到了空白!

public static void main(String[] args) 
{

    int y=333;//if y is 777 i am getting blank
    int sum=0;
    String s;
    char []ch;
    do
    {
        s=String.valueOf(y);
        ch=s.toCharArray();

        if(ch.length>1) 
        {
            for(int i=0;i<ch.length;i++)
            {
            sum+=Character.getNumericValue(ch[i]);
            }
        }
        else
        {
        System.out.println(sum);
        }
        y=sum;      

    }while(ch.length>1);

}

3
递归解决方案在此情况下更为适合。同时,可以避免昂贵的字符串转换来解决问题。提示:使用模运算和除以10的整数除法即可。 - Bathsheba
@batsheba 实际上,对于十进制来说,模9的效果更好(对于二进制,您可以使用模1) - John Dvorak
8个回答

5

你的代码可能会一直循环下去

正确的解决方法如下所示

public static void main(String[] args) throws ParseException {
int y = 777;// if y is 777 i am getting blank
int sum = 0;
String s;
char[] ch;
do {
    sum = 0;
    s = String.valueOf(y);
    ch = s.toCharArray();
    if (ch.length > 1) {
        for (int i = 0; i < ch.length; i++) {
            sum += Character.getNumericValue(ch[i]);
        }
    } else {
        System.out.println(ch[0]);
        break;
    }
    y = sum;
} while (ch.length > 1);
}

也许更好的选择是以下代码。
public static void main(String[] args) throws ParseException {
    int y = 333;// if y is 777 i am getting blank
    int sum = 0;
    while (y % 10 != 0) {
        sum += y %10;
        y = y / 10;
        if (0 == y && sum >= 10) {
            y = sum;
            sum = 0;
        }
    }
    System.out.println(sum);
}

希望这有所帮助。


3

对于这样的任务,最佳实践是使用递归。

伪代码中的工作流程如下:

procedure sumTillOneDigit(n)
    split n into it's digits
    s := sum of all digits of n

    if s has more than one digit:
        sumTillOneDigit(s)
    else
        output s

我有意将此内容用伪代码编写,因为这应该能帮助您解决任务。 我不会提供Java实现,因为对我来说它看起来像一份家庭作业。

更多信息请参见:


2
您可以通过一行代码解决此问题:
public static int sumDigits(int n) {
    return (1 + ((n-1) % 9);   
  }

例如:输入 777--> 返回 1 + ( (777-1) % 9) = 3 也适用于负数。

2

首先,您必须重置sum变量的值。

其次,在else条件下,您必须打印s而不是sum,其他都没问题

public static void main(String[] args) 
{

    int y=333;//if y is 777 i am getting blank
    int sum;
    String s;
    char []ch;
    do
    {
        sum=0;
        s=String.valueOf(y);
        ch=s.toCharArray();

        if(ch.length>1) 
        {
            for(int i=0;i<ch.length;i++)
            {
            sum+=Character.getNumericValue(ch[i]);
            }
        }
        else
        {
        System.out.println(s);
        }
        y=sum;      

    }while(ch.length>1);

}

2
我认为你的解决方案基础有误。将数字转换为字符串并将其处理为字符数组没有意义。你做了太多不必要的操作。
如果你坚持使用数字,可以更简单地完成。
你可以使用递归来完成:
public static int sumRec(int number){
    if (number<10){
        return number;
    }
    int sum = 0;
    while(number!=0){
        sum += number %10;
        number /= 10;

    }
    return sumRec(sum);
}

或迭代
public static int sumIt(int number){
    while(number>=10){
        int sum = 0;
        while(number!=0){
            sum += number %10;
            number /= 10;
        }   
        number = sum;
    }
    return number;
}

这个很简单,对吧?


我同意这种方法更简单,但是当你第一次解决逻辑问题时,你怎么知道需要除以/模10?我很不擅长数学 :) - Akhil Maripally

2

你之所以会得到那个输出结果,是因为你将print语句放在了else条件中。

另外需要注意的是,在重复使用sum值之前需要将其重置。即在do循环开始时设置sum=0。

编辑: 有两种解决方案可以打印你的值: 1. 不要将你的print语句放在else条件中。

  1. 在do while循环结束后打印sum的值。

1

递归变量

public static int myFunction(int num){
    if(num/10 == 0){
        return num;
    }

    int digitSum = num%10 + myFunction(num/10);

    if(digitSum/10 == 0){
        return digitSum;
    }

    return myFunction(digitSum);
} 

0
public static int sum_of_digits(int n) {
    return --n % 9 + 1;
}

2
考虑添加一些对你的代码所做事情的解释。 - Miguel Isla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接