我想知道为什么在从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);
}
由于
答案 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;
}