在方法中计算连续功率的数字总和的最佳方法是什么?
示例:
number array
我想使用流,因为我正在尝试练习一些J8功能,但找不到让它工作的方法。
编辑:我需要它来解决这个问题:https://www.codewars.com/kata/5626b561280a42ecc50000d1/train/java
EDIT2:到目前为止,这是我的代码:
Public Class MyForm()
Public Shared myDic As New Dictionary(Of String, MyClass.myStruct)
End Class
Public Class MyClass()
Private Shared myDic As New Dictionary(Of String, Proprieta)
Public Structure myStruct
Dim x as Integer
Dim y as Integer
Dim z as Integer
Dim t as Integer
End Structure
Public Sub mySub(prepareDic as Dictionary(Of String, Proprieta))
myDic = prepareDic
'My Code
End Sub
End Class
我不知道如何将来自php artisan make:middleware GlobalConfigMiddleware
的数字与其连续的权力进行映射,以便我可以对该地图中的值进行求和。
答案 0 :(得分:5)
这是一个没有流的解决方案。
public static int digitPow(int n) {
int result = 0;
int count = (int)(Math.log10(n) + 1); // number of digits in n
while (count > 0) {
result += Math.pow((n % 10), count);
n /= 10;
count--;
}
return result;
}
答案 1 :(得分:2)
这适用于你:
```
String str = String.valueOf(122);
DoubleSummaryStatistics collect = IntStream.range(0, str.length()) //1
.mapToObj(i -> {
int digit = Character.digit(str.charAt(i), 10); //2
return Math.pow(digit, i + 1); //3
})
.collect(Collectors.summarizingDouble(i -> i)); //4
System.out.println(collect.getSum());
```
答案 2 :(得分:2)
要修复已有的内容,诀窍就是使用IntStream
public static void calculateSum(int input) {
String[] number = String.valueOf(input).split("");
int sum = IntStream.range(0, number.length)
.map(i -> (int)Math.pow(Integer.valueOf(number[i]), i + 1))
.sum();
System.out.println(sum)
}
答案 3 :(得分:1)
仅供参考: Stream不是解决此类问题的好方法。强制使用Streams是错误的编码。编写好代码的一部分是识别正确的工作工具,Stream不是这里使用的工具。
为了防止double
不准确的任何潜在问题,这里有一个纯粹的int
解决方案:
private static int calculateSum(int input) {
if (input < 0)
throw new IllegalArgumentException("Negative: " + input);
int[] digit = new int[10], power = new int[10];
for (int i = 0, n = input; n != 0; i++, n /= 10) {
for (int j = 0; j < i; j++)
power[j] *= digit[j];
power[i] = digit[i] = n % 10;
}
int sum = 0;
for (int i = 0; i < 10; i++)
sum += power[i];
if (sum < 0)
throw new ArithmeticException("Overflow: " + input);
return sum;
}
测试
public static void main(String[] args) {
test(5);
test(12);
test(26);
test(122);
test(Integer.MAX_VALUE);
test(1999999998);
}
private static void test(int input) {
System.out.printf("%d -> %d%n", input, calculateSum(input));
}
输出
5 -> 5
12 -> 5
26 -> 38
122 -> 13
2147483647 -> 284684832
1999999998 -> 1509589865
请注意,以9
结尾的10位数字会溢出。