Fibonacci的ACM库代码

时间:2014-08-15 15:04:57

标签: numbers fibonacci acm

您好我对此页面中找到的此代码有疑问。 我已经完成了我自己的斐波纳契,但我认为这更好。 我们的想法是你必须选择“n”并且代码一直有效直到你达到n。 它适用于第一个数字,但我不知道为什么当我选择例如n = 70时,有负数!我不知道为什么这个hapens但我无法解决它,我试图解决我的书的所有练习,因为这些方法对我来说很难。索里为我可怜的英语。

public class NewFibonacci extends ConsoleProgram {
 int a = 0;
 int b = 1;

public void run() {
    int n = readInt ("n: ");
    for(int i = 0; i <= n; i++) {
        println (fibonacci (n));
    }
}

private int fibonacci(int n) {
    int c = a + b;
    a = b;
    b = c;
    return c;
}
}           

谢谢!

3 个答案:

答案 0 :(得分:0)

int限制为一定数量的位。如果您使用的是Java,那么int可以容纳32位(范围从-2,147,483,648到2,147,483,647)。一旦Fibonacci数字高于int的最大值,您就会开始看到负值。

答案 1 :(得分:0)

Ryan是正确的 - 在达到int的最大限制后,它将变为负数。您发布的代码将打印出前n + 1个Fibonacci数字(您从0开始,到70 = 71个数字)。第71个斐波纳契数是308,061,521,170,129,这超过了int的限制。

不使用int,而是使用long,其最大限制为9,223,372,036,854,775,807,这至少会使你达到n = 91(前92个Fibonacci数字 - 最多7,540,113,804,746,346,429)。

答案 2 :(得分:0)

您可以尝试使用此代码,然后获得一个称号。

public class NewFibonacci extends ConsoleProgram {
 long long a = 0;
 long long b = 1;

public void run() {
    int n = readInt ("n: ");
    for(int i = 0; i <= n; i++) {
        println (fibonacci (n));
    }
}

private int fibonacci(int n) {
    long long c = a + b;
    a = b;
    b = c;
    return c;
}
}