C ++ cout不会打印

时间:2014-09-11 19:19:59

标签: c++ printing main cout

标题是什么,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;
}

3 个答案:

答案 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)。你随时都要保留这笔钱,所以你只需要保留最后两个数字;不是整个历史。