C++cout将不会打印



标题说的是,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;
}

相关内容

  • 没有找到相关文章