Проект Эйлера №2 Бесконечность? - PullRequest
5 голосов
/ 20 января 2012

Я пытаюсь решить Проект Эйлера # 2 , и я продолжаю получать ответ "Бесконечность" или "NaN" (не число). Я пытался изменить тип числа на int ( первоначально Double), но это ничего не исправило, просто дал мне ответ "-1833689714"

public class Pro {
    static int g = 1;
    static int n, f = 0;
    public static void main(String args[]) {
        for (int i = 0; i <= 4000000; i++) {
            f = f + g;
            g = f - g;
            if (f % 2 == 0) {
                n += f;
            }
        }
        System.out.println("Answer: " + n);
    }
}

Вопросы:

Каждый новый член в последовательности Фибоначчи генерируется путем добавления двух предыдущих членов. Начиная с 1 и 2, первые 10 слагаемых будут:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Рассматривая члены в последовательности Фибоначчи, значения которых не превышают четырех миллионов, найдите сумму четных членов.

Ответы [ 7 ]

8 голосов
/ 20 января 2012

Вы рассматриваете первые 4 000 000 членов последовательности Фибоначчи вместо первых x членов, которые не превышают 4 000 000.

3 голосов
/ 20 января 2012

Ваша проблема - целочисленное переполнение: в Java переменная int ограничена Integer.MAX_VALUE (2147483647).Если вы превысите это значение в вычислении, вы переполнитесь до Integer.MIN_VALUE, наименьшее отрицательное значение.См .:

public class IntegerOverflow {
    public static void main(String[] args) {
        int i = Integer.MAX_VALUE;
        System.out.println("i = Integer.MAX_VALUE: " + i);
        System.out.println("i + 1: " + (i + 1));
        System.out.println("i + 2: " + (i + 2));
    }
}

Чтобы избежать проблем с переполнением, выполните вычисления с целыми числами произвольной точности , предоставляемыми классом java.math.BigInteger:

import java.math.BigInteger;

public class BigIntegerExample {
    public static void main(String[] args) {
        BigInteger b = BigInteger.valueOf(Long.MAX_VALUE);
        System.out.println("b = Long.MAX_VALUE: " + b);
        System.out.println("b**2: " + b.multiply(b));
        System.out.println("b**3: " + b.pow(3));
        System.out.println("b**10: " + b.pow(10));
    }
}

Примечание : Поскольку вы не обращались за помощью в самой проблеме, я просто отвечаю на вопрос.Надеюсь, это поможет

2 голосов
/ 20 января 2012

Возможно, вы столкнулись с переполнением.fibo(4000000) намного выше MAX_INT.

Примечание: , что вас не просят найти сумму четных чисел в первых 4 000 000 чисел, но найти сумму четных элементов, которыеих значение не превышает 4 000 000.

Вы должны проверить, если f< 4000000, а если нет, сломаться и не ждать, пока i не достигнет 4 000 000

1 голос
/ 20 января 2012

Вы проверяете первые 4 миллиона фибоначчи, вам нужно только проверять условия, пока срок фибоначчи не превысит 4 миллиона, а затем прекратите. Причина, по которой вы получаете отрицательные числа, заключается в том, что вы в конечном итоге получаете термины Фибоначчи, которые больше, чем Integer.MAX_INT, и в этот момент вы переполняетесь и начинаете получать отрицательные числа, которые вы добавляете к вашему итоговому числу. Если вы не уверены, будет ли окончательный ответ превышать Integer.MAX_INT, вы должны использовать long как аккумулятор вместо int.

0 голосов
/ 02 марта 2013

Вот как я получил ответ:

def fib():
        x,y = 0,1
        while True:
            yield x
            x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000:
            break
        yield number   

print sum(even(under_a_million(fib())))

-M1K3

0 голосов
/ 20 января 2012

Вы можете использовать long вместо int.

Каждое третье выражение является четным, поэтому вам нужно только оценить каждое третье значение.Это немного быстрее, потому что циклы выполняются меньше раз, и вам не нужно проверять четность / нечетность.

Вам нужно всего лишь n, а не i, что меньше 4 миллионов.

0 голосов
/ 20 января 2012

Используйте GMP для обработки больших чисел в C. И немного размышлений до этого тоже не повредит (например, как часто встречается нечетное число против четного, какова сумма первых n элементов последовательности Фибоначчи) ...

...