数字总和,直到总和为一位数
sum of digits till the sum is one-digit number
我是初学者 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);
}
你得到那个是因为你把 print 语句放在 else 条件下..
另请注意,在重新使用之前重置您的 sum 值。 IE。在 do 循环开始时设置 sum=0。
编辑:有两种解决方案可以打印您的价值
1. 不要在 else 条件下打印语句
- 在 do while 循环外打印总和
对于这样的任务,最好使用递归。
伪代码中的工作流程如下所示:
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 而不是总和,其余的是 fine。
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);
}
您的代码可能会永远循环
正确的解决方案如下
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);
}
希望有所帮助
我认为您的解决方案基础有误。将您的数字转换为 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);
}
或迭代
public static int sumIt(int number){
while(number>=10){
int sum = 0;
while(number!=0){
sum += number %10;
number /= 10;
}
number = sum;
}
return number;
}
简单多了,对吧?
您可以通过 1 行解决此问题:
public static int sumDigits(int n) {
return (1 + ((n-1) % 9);
}
例如:输入777
-->return1 + ( (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);
}
public static int sum_of_digits(int n) {
return --n % 9 + 1;
}
我是初学者 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);
}
你得到那个是因为你把 print 语句放在 else 条件下..
另请注意,在重新使用之前重置您的 sum 值。 IE。在 do 循环开始时设置 sum=0。
编辑:有两种解决方案可以打印您的价值 1. 不要在 else 条件下打印语句
- 在 do while 循环外打印总和
对于这样的任务,最好使用递归。
伪代码中的工作流程如下所示:
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 而不是总和,其余的是 fine。
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);
}
您的代码可能会永远循环
正确的解决方案如下
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);
}
希望有所帮助
我认为您的解决方案基础有误。将您的数字转换为 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);
}
或迭代
public static int sumIt(int number){
while(number>=10){
int sum = 0;
while(number!=0){
sum += number %10;
number /= 10;
}
number = sum;
}
return number;
}
简单多了,对吧?
您可以通过 1 行解决此问题:
public static int sumDigits(int n) {
return (1 + ((n-1) % 9);
}
例如:输入777
-->return1 + ( (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);
}
public static int sum_of_digits(int n) {
return --n % 9 + 1;
}