1

我想知道为什么以下基于模运算int的代码解决方案在从类型转移到类型时不起作用long

例如给定111111111111L我想退货12L

如何实现以下问题中描述的相同预期行为(仅适用于 int 类型值)? 给定正数的所有数字的总和

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

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

谢谢

4

5 回答 5

3

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

反复将数字的位数相加,直到获得一位数的结果。

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

当您考虑它时,n % 9不可能返回12(这是您所说的您所期望的)。

于 2013-08-25T14:02:17.687 回答
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;
}
于 2013-08-25T15:07:46.713 回答
2

递归、高效的解决方案:

public static long digitSum(long n) {
    if (n == 0)
        return 0;
    return n%10 + digitSum(n/10);
}
于 2013-08-25T14:55:28.320 回答
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;
}
于 2013-08-25T14:48:14.463 回答
1

经过一些不同数字的测试,比较了涉及 3 种不同方法的 3 种不同功能,我得出了以下解决方案:

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

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

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;
}
于 2013-08-26T23:12:10.897 回答