Java 数字之和,直至总和为一位数
我是一名java初学者,正在尝试解决棘手的问题 输入=777Java 数字之和,直至总和为一位数,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
输出应为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.不要将打印语句放在其他条件中
对于这样的任务,最好使用递归 伪代码中的工作流如下所示:
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实现,因为它看起来像是我的家庭作业
有关更多信息,请参阅:
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;
}