Java中给定的正数类型的所有数字的总和

时间:2013-08-25 13:55:29

标签: java performance algorithm modulo

我想知道为什么在从int类型转换为long类型时,基于模运算的以下代码解决方案无效。

例如,给定111111111111L我想返回12L

如何实现以下问题中描述的相同预期行为(仅适用于int类型值)? Sum of all digits for a given Positive Number

我也专注于性能问题,所以我正在寻找一种有效的解决方案。

public static long sumTheDigitsVersion1(long inputValue){
    long sum = inputValue % 9L;
        if(sum == 0){
            if(inputValue > 0)
                return 9L;
        }
    return sum;
}

public static long sumTheDigitsVersion2(long inputValue){
    return inputValue - 9L * ((inputValue - 1L) / 9L);
}

由于

5 个答案:

答案 0 :(得分:3)

解决方案不起作用,因为它是解决不同问题的方法,即:

  

重复将数字加起来,直到您获得一位数的结果。

换句话说,它计算111111111111 - > 12 - > 3

当您考虑它时,n % 9无法返回12(这就是您所说的'期待)。

答案 1 :(得分:2)

递归,高效的解决方案:

public static long digitSum(long n) {
    if (n == 0)
        return 0;
    return n%10 + digitSum(n/10);
}

答案 2 :(得分:2)

尽可能高效地获得它:

private static final int PART_SIZE = 1000;
private static final int[] digitSums = new int[PART_SIZE];
static {
    for (int i = 0; i < digitSums.length; i++) {
        for (int n = i; n != 0; n /= 10) digitSums[i] += n % 10;
    }
}

public static long digitSum(long n) {
    int sum = 0;
    do {
        sum += digitSums[(int)(n % PART_SIZE)];
    } while ((n /= PART_SIZE) != 0);
    return sum;
}

答案 3 :(得分:1)

这可能不是最有效的选择,但它是我能想到的唯一一个:

public static long getDigitalSum(long n){
    n = Math.abs(n); //This is optional, remove if numbers are always positive. NOTE: Does not filter Long.MIN_VALUE

    char[] nums = String.valueOf(n).toCharArray();
    long sum = 0;

    for(char i:nums){
        sum = sum + Integer.parseInt(String.valueOf(i)); //Can use Long.parseLong() too
    }

    return sum;
}

答案 4 :(得分:1)

在使用不同数字进行一些测试后,我得出了以下解决方案,比较了涉及3种不同方法的3种不同功能:

  • toCharArray()和循环,
  • 基本的数学计算和循环,
  • 递归。

我使用System.nanoTime()根据时间维度比较了3种不同的方法。

public static long sumTheDigits(long currentIterationValue){

    long currentDigitValue;
    long sumOutputValue = 0;

    while(currentIterationValue != 0) {
        currentDigitValue = currentIterationValue % 10;
        currentIterationValue = currentIterationValue / 10;
        sumOutputValue = sumOutputValue + currentDigitValue;
    }
    return sumOutputValue;
}