Серия, державы и скамейки

Проблема Эйлера Эйлера 48

  

Ряд, \ $ 1 ^ 1 + 2 ^ 2 + 3 ^ 3 + ... + 10 ^ {10} = 10405071317 \ $.

     

Найдите последние десять цифр серии, \ $ 1 ^ 1 + 2 ^ 2 + 3 ^ 3 + ... + 1000 ^ {1000} \ $.

Я сделал две разные реализации этой проблемы и добавил контрольный показатель, используя библиотека.

Код:

public class ProjEuler48 {

    private static final int DIGITS = 10;
    private static final BigInteger MOD = BigInteger.TEN.pow(DIGITS);

    public static void main(String[] args) {
        final int max = 1000;
        UBench bench = new UBench(ProjEuler48.class.getSimpleName());
        Predicate<BigInteger> predicate = value -> value.longValue() == 9110846700L;
        bench.addTask("Loops", () -> selfPowerSumMod(max, MOD), predicate);
        bench.addTask("Streams", () -> selfPowerSumModStreams(max, MOD), predicate);
        bench.report("RESULTS", bench.press(1000));
    }

    private static BigInteger selfPowerSumModStreams(int max, BigInteger mod) {
        return IntStream.rangeClosed(1, max)
                .parallel()
                .mapToObj(i -> BigInteger.valueOf(i))
                .map(bi -> bi.modPow(bi, MOD))
                .reduce(BigInteger.ZERO, BigInteger::add, BigInteger::add)
                .mod(mod);
    }

    public static BigInteger selfPowerSumMod(int max, BigInteger mod) {
        BigInteger sum = BigInteger.ZERO;
        for (int i = 1; i <= max; i++) {
            sum = sum.add(selfPower(i)).mod(mod);
        }
        return sum;
    }

    public static BigInteger selfPower(int i) {
        BigInteger result = BigInteger.valueOf(i);
        return result.modPow(result, MOD);
    }

}

Результаты тестов на моей машине:

 RESULTS
=======

Task ProjEuler48 -> Loops: (Unit: MILLISECONDS)
  Count    :     1000      Average  :   2.5267
  Fastest  :   2.0137      Slowest  :  35.8331
  95Pctile :   4.2812      99Pctile :   8.3346
  TimeBlock : 4.718 2.646 2.801 2.280 2.191 2.128 2.119 2.124 2.132 2.127
  Histogram :   936    53    10     0     1

Task ProjEuler48 -> Streams: (Unit: MILLISECONDS)
  Count    :     1000      Average  :   0.8798
  Fastest  :   0.3701      Slowest  :  37.6239
  95Pctile :   2.7441      99Pctile :   5.5763
  TimeBlock : 3.032 1.041 1.285 0.596 0.476 0.485 0.467 0.473 0.464 0.479
  Histogram :   802    75    86    27     9     0     1

Как этот код с точки зрения Project Euler, Java 8, производительности и всего?

11 голосов | спросил Simon Forsberg 12 MarpmThu, 12 Mar 2015 16:34:07 +03002015-03-12T16:34:07+03:0004 2015, 16:34:07

1 ответ


10

Это выглядит неплохо. Несколько изменений, которые я сделал бы:

Производительность

10^10, 20^20 и все высшие полномочия всегда будут заканчиваться на 0000000000, что означает, что они не влияют на сумму. Вы должны иметь возможность повысить производительность на 10%, не вычисляя эти полномочия. Это было бы легко сделать в случае с вашими циклами, но для потоков было бы немного синтаксической ухищрения.

Магические числа

В коде есть магическое число 9110846700L. Не сразу понятно, что это такое, особенно если вы не знакомы с библиотекой UBench . В этом случае это должно быть реорганизовано в константу магического числа. Дальнейшие чтения по этому вопросу

Статические методы

Даже для такой простой программы, я всегда старался не ставить вашу бизнес-логику в статические методы. Очевидно, что в этом случае это не проблема, но для приложения может расти вообще, вы быстро пожалеете об этом. Более подробное чтение

Непоследовательность метода

Один из ваших методов: private, остальные public. Опять же, эта проблема не очень важна для такой короткой программы, но разрешение прерывания инкапсуляции начинает иметь значение, как только программа достигает двух классов.

ответил durron597 12 MarpmThu, 12 Mar 2015 18:16:27 +03002015-03-12T18:16:27+03:0006 2015, 18:16:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132