标题是什么,cout不会打印任何东西!但主要正常完成并返回负数,发生了什么?这是我的代码:
#include <iostream>
using namespace std;
unsigned long fibonacci(long unsigned int *);
int main(void)
{
cout<<"IT WILL NOT PRINT!!!!!";
unsigned long int fib[4000000];
cout<<"SUM OF EVEN FIBONACCI NUMBERS: "<<fibonacci(fib)<<endl;
return 0;
}
unsigned long fibonacci(unsigned long int *FIBO)
{
unsigned long i;
int sum=0,c=0, *EVEN = new int[2000000];
FIBO[0]=1; FIBO[1]=2;
for (i=2;i<3999999;i++){
FIBO[i]=FIBO[i-1]+FIBO[i-2];
if (FIBO[i]%2==0){
EVEN[c]=FIBO[i];
sum+=EVEN[c];
c++;
}
}
delete [] EVEN;
return sum;
}
答案 0 :(得分:1)
std::cout
是缓冲的。如果没有显式刷新,则在内部缓冲区需要刷新之前,您不会看到任何打印内容。这是出于性能原因而完成的。
您可以添加特定的同花顺,如下所示:
std::cout<<"IT WILL NOT PRINT!!!!!" << std::endl;
那就是说,你没有看到输出,因为 你的程序崩溃了 。
unsigned long int fib[4000000];
将需要近15MB的空间(在32位长的int平台上)。在该存储持续时间内,没有足够的堆栈空间来分配如此大的内存块。
对于如此大的块,您需要动态分配块,或者更好:
std::vector<unsigned long int> fib(4000000);
答案 1 :(得分:1)
让我们来看看这个问题:我们希望在预定范围内产生偶数斐波纳契数的总和。
为了清晰起见,重新排列了少量修改:
#include <iostream>
using namespace std;
unsigned long fibonacci(unsigned long int *FIBO)
{
unsigned long i;
int sum=0,c=0, *EVEN = new int[2000000];
FIBO[0]=1; FIBO[1]=2;
for (i=2;i<3999999;i++){
FIBO[i]=FIBO[i-1]+FIBO[i-2];
if (FIBO[i]%2==0){
EVEN[c]=FIBO[i];
sum+=EVEN[c];
c++;
}
}
delete [] EVEN;
return sum;
}
int main(void)
{
unsigned long int fib[4000000];
cout << "SUM OF EVEN FIBONACCI NUMBERS: " << fibonacci(fib) << endl;
return 0;
}
首先,让我们删除函数fibonacci中不需要的代码。我们不需要存储偶数数字,因此我们将删除偶数数组。
unsigned long fibonacci(unsigned long *FIBO)
{
unsigned long i, sum=0;
FIBO[0]=1; FIBO[1]=2;
for (i=2;i<3999999;i++){
FIBO[i]=FIBO[i-1]+FIBO[i-2];
if (FIBO[i]%2==0){
sum += FIBO[i];
}
}
return sum;
}
我们可以更聪明一点 - 我们可以证明每三个斐波纳契数都是偶数。从Fib(0)= 0开始,这允许我们创建一个新函数:
unsigned long sum_even_fibonacci(unsigned long n)
{
unsigned long i, a=0, b=1, c=1, sum=0;
for (i=0;i<n/3;i++){
a = b + c; // Fib(3i)
b = a + c; // Fib(3i+1)
c = a + b; // Fib(3i+2)
sum += a; // Fib(3i) will always be even- add it to sum.
}
return sum;
}
这应该产生系列前n个数字内偶数斐波那契数的总和。
全新计划:
#include <iostream>
using namespace std;
unsigned long sum_even_fibonacci(unsigned long n)
{
unsigned long i, a=0, b=1, c=1, sum=0;
for (i=0;i<n/3;i++){
a = b + c; // Fib(3i)
b = a + c; // Fib(3i+1)
c = a + b; // Fib(3i+2)
sum += a; // Fib(3i) will always be even- add it to sum.
}
return sum;
}
int main(void)
{
cout << "SUM OF EVEN FIBONACCI NUMBERS: " << sum_even_fibonacci(4000000) << endl;
return 0;
}
答案 2 :(得分:1)
但是主要正常完成并返回一个负数,
在您的代码main
中返回0
,这是唯一的返回路径。因此,退出负代码的流程意味着main()
永远不会完成。
最有可能的是,数组unsigned long int fib[4000000];
对于系统的默认堆栈大小来说太大了,操作系统通过使用该负数退出流程来处理此问题。
要解决此问题,请将该数组设为较小的批次或将其完全删除;或使用动态分配。
请注意,甚至不需要此数组(也不需要EVEN
)。你随时都要保留这笔钱,所以你只需要保留最后两个数字;不是整个历史。