Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数字之和,直至总和为一位数_Java_Do While - Fatal编程技术网

Java 数字之和,直至总和为一位数

Java 数字之和,直至总和为一位数,java,do-while,Java,Do While,我是一名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

我是一名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);

}
publicstaticvoidmain(字符串[]args)
{
int y=333;//如果y是777,我将变为空白
整数和=0;
字符串s;
char[]ch;
做
{
s=字符串的值(y);
ch=s.toCharArray();
如果(通道长度>1)
{
对于(int i=0;i1);
}

您之所以会得到它,是因为您将print语句置于else条件下

还要注意的是,在重复使用之前,要重置您的总和值,即在do循环开始时将总和设置为0

编辑:有两种方法可以打印您的值 1.不要将打印语句放在其他条件中

  • 在do while循环外打印sum

  • 对于这样的任务,最好使用递归

    伪代码中的工作流如下所示:

    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实现,因为它看起来像是我的家庭作业

    有关更多信息,请参阅:


    首先必须重置sum变量的值

    第二,您必须在else条件下打印s,而不是总和和剩余值很好

    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);
    
    }
    
    publicstaticvoidmain(字符串[]args)
    {
    int y=333;//如果y是777,我将变为空白
    整数和;
    字符串s;
    char[]ch;
    做
    {
    总和=0;
    s=字符串的值(y);
    ch=s.toCharArray();
    如果(通道长度>1)
    {
    对于(int i=0;i1);
    }
    
    您的代码可能会永远循环

    正确的解决方案如下所示

    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 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 sumDigits(int n) {
        return (1 + ((n-1) % 9);   
      }
    
    例如:输入
    777
    -->返回
    1+((777-1)%9)=3

    也可以处理负数。

    递归变量

    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);
    } 
    

    这是递归解决方案更好的一种情况。也可以解决这一问题,而无需将其转换为字符串。提示:使用模和整数除10。@batsheba实际上,模9工作得更好(对于十进制;对于二进制,使用模1)我同意这要简单得多,但是当你第一次解逻辑的时候,你怎么知道你需要把/mod除以10呢?我的数学很差:)考虑对你的代码做一些解释。
    public static int sumDigits(int n) {
        return (1 + ((n-1) % 9);   
      }
    
    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);
    } 
    
    public static int sum_of_digits(int n) {
        return --n % 9 + 1;
    }