到总和的数字之和是一位数

时间:2015-08-23 08:43:34

标签: 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
    {
        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);

}

8 个答案:

答案 0 :(得分: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);
}

希望有所帮助

答案 1 :(得分: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 :(得分:2)

你得到的是因为你把print语句放在了else条件下。

另请注意,在重新使用之前重置总和值。即在do循环开始时设置sum = 0.

编辑:有两种解决方案可以打印您的价值 1.不要把打印陈述放在其他条件中

  1. 在do while循环之外打印总和

答案 3 :(得分:2)

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

其次你必须在其他情况下打印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);

}

答案 4 :(得分:2)

我认为你的解决方案有错误的基础知识。没有必要将您的数字转换为String并将其作为char数组处理。你做了太多不必要的操作。

如果你坚持使用数字,你可以做得更简单。

你可以使用递归来实现:

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

或itteration

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

它更简单,对吧?

答案 5 :(得分:2)

您可以通过1行解决此问题:

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

例如:输入777 - &gt;返回1 + ( (777-1) % 9) = 3

也可以使用负数。

答案 6 :(得分: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);
} 

答案 7 :(得分:0)

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