C++ 计算填充64格所需的大米总数

C++ 计算填充64格所需的大米总数,c++,C++,我只想计算填充64格棋盘需要多少米,但问题是,若我减少行数和列数,那个么程序运行良好,但若我输入实际的8*8行数和列数,那个么它会显示0 我认为长数据类型不足以存储我所需的输出,那么我将使用什么 #include <iostream> #include<cstring> #include<stdlib.h> using namespace std; long fn() { int val; long i=1; for(int row=

我只想计算填充64格棋盘需要多少米,但问题是,若我减少行数和列数,那个么程序运行良好,但若我输入实际的8*8行数和列数,那个么它会显示0 我认为长数据类型不足以存储我所需的输出,那么我将使用什么

#include <iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;

long fn()
{
    int val;
    long i=1;
    for(int row=1;row<=8;row++)
    {
        for(int col=2;col<=8;col++)
        {
            val = i*2;
            i=val;
        }
    }
    return i;
}



main()
{
    cout << fn();

}
我不需要完整的代码作为答案,请告诉我必须使用哪种数据类型,或者如果我做错了,请只提供建议而不是解决方案。谢谢。

您需要64位无符号来表示结果

C++标准要求无符号的long long至少是那个大小,所以这就是使用的。< /P> 顺便说一句,答案是

~(uint64_t)0;
您需要一个64位无符号字符来表示结果

C++标准要求无符号的long long至少是那个大小,所以这就是使用的。< /P> 顺便说一句,答案是

~(uint64_t)0;

代码计算的值似乎小于2^64,即18.446.744.073.709.551.616,约为1.8*10^19。无符号long-long int可以存储高达18.446.744.073.709.551.615的值


对于经典问题,你必须计算和1+2+2^2+2^3+…+2^63,即2^64-1,与无符号long-long int的最大值相同。为此,请修改代码,如下所示:

unsigned long long int fn()
{
    unsigned long long int val = 0;
    unsigned long long int i = 1;

    for(int row = 1; row <= 8; row++)
    {
        for(int col = 1; col <= 8; col++)
        {
            val = val + i;
            i = i * 2;
        }
    }

    return val;
}

代码计算的值似乎小于2^64,即18.446.744.073.709.551.616,约为1.8*10^19。无符号long-long int可以存储高达18.446.744.073.709.551.615的值


对于经典问题,你必须计算和1+2+2^2+2^3+…+2^63,即2^64-1,与无符号long-long int的最大值相同。为此,请修改代码,如下所示:

unsigned long long int fn()
{
    unsigned long long int val = 0;
    unsigned long long int i = 1;

    for(int row = 1; row <= 8; row++)
    {
        for(int col = 1; col <= 8; col++)
        {
            val = val + i;
            i = i * 2;
        }
    }

    return val;
}


使用调试器逐步检查代码,找出其行为不符合预期的原因。为什么列循环从2开始?您的电路板只有7x8个字段。请注意,由于i=val;你有效地使用了int的范围,而不是long的范围。我想你指的是这个问题。为什么不直接使用这个解决方案呢?因为1的平方是1,所以我跳过了1,从2开始。使用调试器一步一步地检查代码,找出为什么它的行为不符合预期。为什么列循环从2开始?您的电路板只有7x8个字段。请注意,由于i=val;你有效地使用了int的范围,而不是long的范围。我想你指的是这个问题。为什么不使用直接解呢?因为1的平方是1,所以我跳过了1,从2开始。与无符号长整型的最大值相同-不是necessarily@Bathsheba你的意思是它取决于架构?几乎,标准设定了一个最小范围,仅此而已,这就是为什么我会小心地用我的方式写我的答案。@vasile\t我运行你的代码来检查1行和8列来测试你的代码,显示255作为1行的结果,这应该是128。@vasile\t我建议你作为一个证据,与无符号long int的最大值相同-不是necessarily@Bathsheba你的意思是这取决于天气架构?几乎,标准设定了最小范围,仅此而已,这就是为什么我会小心地用我的方式写我的答案。@vasile\u我运行你的代码来检查1行和8列来测试你的代码,显示255作为1行的结果,应该是128。@vasile\u我推荐你作为无符号long给我72057594037927936的证据。这是正确的吗?我不认为这是正确的输出,你有什么吗关于我的问题的其他想法,请评论,谢谢你的回答。为什么你要从2运行内部循环?如果我只运行1行8列的代码,它应该显示128。对,但它显示256,如果我从2开始,那么它显示正确的128。你认为它是对的还是错的。unsigned long long long给我的72057594037927936是正确的吗?我不认为这是正确的输出。你对我的问题有任何其他想法,所以请评论并感谢你的回答。你为什么从2运行内部循环?如果我只运行1行8列的代码,它应该需要显示128。对,但它显示256,如果我从2开始,那么它显示正确的128。你认为这是对的还是错的。