#include <stdlib.h>
#include <stdio.h>
int main (){
int n, cont, fib, na = 0, nb = 1, sum_even = 0;
printf ("Insert a number and I'll tell you the respective Fibonacci: ");
scanf ("%d", &n);
for (cont = 1; cont < n; cont++) {
na += nb;
nb = na - nb;
fib = na + nb;
if (fib % 2 == 0) {
sum_even += fib;
}
}
printf ("%d\n", sum_even);
return 0;
}
我正在尝试使用Project Euler Problem 2,然后我想出了这段代码。问题是:我找不到斐波那契序列中对数的总和,因为数字超过400或接近数字,因为内存溢出。因此,我无法解决这个练习,因为它要求在斐波那契序列中找到4000000以下的对数的总和。任何人都可以帮助我吗?
编辑: 我尝试使用float类型数来增加答案的容量,它似乎工作到一千左右,但如果我尝试使用更大的数字,我在bash中得到一个-nan错误,就像处理15秒(我不真的知道这意味着什么。)
#include <stdlib.h>
#include <stdio.h>
int main () {
int n, cont, div;
float sum_even = 0, na = 0, nb = 1, fib;
printf ("Insert a number and I'll tell you the respective Fibonacci: ");
scanf ("%d", &n);
for (cont = 1; cont <= n; cont++) {
na += nb;
nb = na - nb;
fib = na + nb;
div = fib / 2;
if (div % 2 == 0) {
sum_even += fib;
}
}
printf ("%f\n", sum_even);
return 0;
}
答案 0 :(得分:15)
您观察到的不是内存溢出,而是数字溢出。练习的重点是表明溢出确实发生了,并让你学习处理它的技巧。在这种特殊情况下,他们希望您实施arbitrary precision integer arithmetic,或借用预先制定的实施方案并将其与您的解决方案一起使用。
答案 1 :(得分:2)
你误解了问题陈述。任务是找到
的总和{ fib(n) : fib(n) <= 4000000 && fib(n) % 2 == 0 }
而不是
{ fib(n) : n <= 4000000 && fib(n) % 2 == 0 }
通过对代码进行微小修改,可以轻松解决该任务问题。而不是
for (cont = 1; cont < n; cont++) {
使用
while(fib <= n) {