标题说的是,cout不会打印任何内容!但main正常结束并返回负数,发生了什么?这是我的代码:
#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;
}
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);
但main正常完成并返回一个负数,
在您的代码中,main
返回0
,这是唯一的返回路径。因此,进程以负返回代码退出意味着main()
从未完成。
最有可能的是,数组unsigned long int fib[4000000];
对于系统的默认堆栈大小来说太大了,操作系统通过使进程以负数退出来处理此问题。
要解决此问题,请将该数组缩小批次或将其完全删除;或者使用动态分配。
请注意,甚至不需要具有此阵列(也不需要EVEN
)。你边走边记,所以你只需要保留最后两个数字;而不是整个历史。
让我们来看看这个问题:我们想要在预定义的范围内生成偶数斐波那契数的和。
为清晰起见,对进行了小编辑:
#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中不需要的代码。我们不需要存储偶数,所以我们将删除even数组。
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;
}