6

方法返回应该是如果输入一个数字,假设 345,那么输出应该是 3+4+5=12 --> 1+2 = 3。我在这里做错了什么?

public class DigitSum
 {
    int  Sum=0;

    public int compute( int MethParam )
    {
        int rem = MethParam%10; 
        Sum+=rem;        

        MethParam = MethParam/10; 
        if(MethParam>10)
            compute(MethParam);

        return Sum+MethParam;  
    }

  public static void main(String[] args)
  {
    DigitSum ds  = new DigitSum();
    System.out.println(ds.compute(435));
  }
}
4

13 回答 13

27

O(1) 数字总和算法:

取任何数字的模 9 将返回该数字的数字总和,直到获得单个数字。

如果数字是 9 的倍数,那么总和将为 9

一个班轮:

public int sumDigit(int n){
    return (n%9 == 0 && n != 0) ? 9 : n%9;
}

替代实现:

public int sumDigit(int n){

      int sum = n % 9;
      if(sum == 0){
          if(n > 0)
               return 9;
      }
      return sum;
}
于 2012-12-21T07:29:09.867 回答
8

您正在寻找的是数字根wiki因此,使用我链接的页面中的公式,这是一个更好的解决方案。

没有递归: -

public static int compute( int n ) {
    return n - 9 * ((n - 1) / 9);
}

而且,以防万一你想要(我认为你不会),这里有一个单行 (使用递归): -

public static int compute( int n ) {
    return n < 10 ? n : compute(n % 10 + compute(n / 10));
}
于 2012-12-21T07:42:12.910 回答
7
    public int FindSumDigit(int number)
    {
        if (number < 10) return number;
        int sum = 0;
        while (number > 0)
        {
            sum += number % 10;
            number = number / 10;
        }
        return FindSumDigit(sum);
    }

找到我的代码...... Poon 你没有添加整个数字.. 在中间你一直在添加最右边的数字。

于 2012-12-21T07:21:30.687 回答
3

这里有很多错误的答案。这是OP想要的:

方法返回应该是如果输入一个数字,假设 345,那么输出应该是 3+4+5=12 --> 1+2 = 3。

这将完成这项工作:

public static int compute(int param) {
    int sum = 0;
    do {
        sum = 0;
        while (param > 0) {
            sum += param % 10;
            param /= 10;
        }
        param = sum;
    } while (sum >= 10);
    return sum;
}
于 2012-12-21T07:27:41.087 回答
1

我将您的方法更改为此,然后它给出了请求的结果:

public int compute(int methParam) {
    int sum = 0;
    for (int i = 0; methParam > 10; i++) {
        int currentDigit = methParam % 10;
        methParam = methParam / 10;
        sum = sum + currentDigit;
    }
    if (sum + methParam > 10) {
        return compute(sum + methParam);
    } else {
        return sum + methParam;
    }
}

请注意,我移动了sum方法内部的声明,而不是使其成为一个字段。

于 2012-12-21T07:19:03.963 回答
1

在您的代码中,您没有正确返回值来调用您的递归方法。

        if ((MethParam >= 10)){
            return compute(MethParam);
        }else
            return Sum + MethParam;
于 2012-12-21T07:29:34.043 回答
0
public int compute( int param )
{
    int x = param % 10;
    int y = param / 10;

    if (y > 0)
        return x + compute(y);

    return x;
}

public int computeNonRec(int param) {
    int result = 0;
    while (param > 0) {
        result += param % 10;
        param /= 10;
    }
    return result;
}
于 2012-12-21T07:16:05.550 回答
0

尝试

 public int sumDigit(int n) {
        int sum = 0;
        while (n > 0) {
            sum += n % 10;
            number = n / 10;
        }
        return sum;
    }
于 2012-12-21T07:25:18.180 回答
0

这是一个字符串解决方案:

public int compute( int MethParam )
{
    int sum = 0; 
    string meth = MethParam.ToString();        

    for (char x in meth) {
        sum += int.Parse(x);
    }
    if (sum >= 10) {
        return compute(sum);
    }
    else {
        return sum;
    }
}

这段代码是 C# 而不是 Java,所以认为它是伪代码。

于 2012-12-21T07:34:42.747 回答
0

只是一种不同的方法,由于涉及转换,可能效率不高:

private static int getUltimateSum(int input) {
    String inputStr = String.valueOf(input);
    int sum = 0;
    for (int i = 0; i < inputStr.length(); i++) {
        int digit = Integer.valueOf(String.valueOf(inputStr.charAt(i)));
        sum += digit;
    }
    if(sum > 9)
        return getUltimateSum(sum);
    else
        return sum;
}
于 2012-12-21T07:40:23.963 回答
0

尝试

public class DigitSum {
int  Sum=0;
public int compute( int MethParam )
{
    int rem = MethParam%10; 
    Sum+=rem;        

    MethParam = MethParam/10; 
    if(MethParam>10)
        compute(MethParam);
    else
        Sum+=MethParam;

        if(Sum>=10){
        int temp=Sum;
        Sum=0;
        compute(temp);
    }

         return Sum;  
}

public static void main(String[] args){
    DigitSum ds= new DigitSum();
        System.out.println(ds.compute(435));
    }
}
于 2012-12-21T07:42:20.063 回答
0

最短的代码是 -

int compute(int n){
    while(n > 9){
        n = n - 9;
    }
    return n;
}

其中 n 是您要计算其某些数字的数字。

编辑:仅对小数字有效,例如 3 位数字。

编辑:测试了几个答案:

public class Test {
    public static void main(String [] args){
        int i = 0x0fefefef;

        long st1 = System.nanoTime();
        int n1 = sumDigit(i);
        long t1 = System.nanoTime() - st1;

        long st2 = System.nanoTime();
        int n2 = FindSumDigit(i);
        long t2 = System.nanoTime() - st2;

        long st3 = System.nanoTime();
        int n3 = compute(i);
        long t3 = System.nanoTime() - st3;

        long st4 = System.nanoTime();
        int n4 = compute1(i);
        long t4 = System.nanoTime() - st4;

        System.out.println("Tested for: "+i);
        System.out.println(n1+": "+t1);
        System.out.println(n2+": "+t2);
        System.out.println(n3+": "+t3);
        System.out.println(n4+": "+t4);
    }

    public static int sumDigit(int n){
      int sum = n % 9;
      if(sum == 0){
          if(n > 0)
               return 9;
      }
      return sum;
    }

    public static int FindSumDigit(int n)
    {
        if (n < 10) return n;
        int sum = 0;
        while (n > 0)
        {
            sum += n % 10;
            n = n / 10;
        }
        return FindSumDigit(sum);
    }

    public static int compute( int n ) {
        return n - 9 * ((n - 1) / 9);
    }

    public static int compute1(int n){
        while(n > 9){
            n = n - 9;
        }
        return n;
    }
}

这是上述测试的结果:

Tested for: 267382767
3: 2432
3: 1621
3: 810
3: 5354519
于 2012-12-21T08:07:15.160 回答
-1

使用我之前创建的一些 tymz 这个简单的 java 代码,这是用于添加正数和负数:

class SumDigit
{
public static void main(String args[])
{
int sum, i,a,d;
a = Integer.parseInt(args[0]);
sum = 0;
for(i=1;i< =10;i++)
{
d = a%10;
a = a/10;
sum=sum + d;
} 
System.out.println("Sum of Digit :"+sum);
}
}
于 2012-12-21T07:11:08.007 回答