计算给定数字中连续功率的数字总和

时间:2017-02-13 21:44:30

标签: java algorithm

在方法中计算连续功率的数字总和的最佳方法是什么?

示例:

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 的数字与其连续的权力进行映射,以便我可以对该地图中的值进行求和。

4 个答案:

答案 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());

```

  1. 生成功率值
  2. 从给定位置的char中提取数字
  3. 计算提取数字的功率
  4. 总结一切

答案 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位数字会溢出。