yueyufeng 发表于 2024-4-7 10:40:11

输出不对

#include <iostream>
using namespace std;
int main()
{
long long sum=(20230408*20230409)/2;
cout<<sum;
return 0;
}

FishC 发表于 2024-4-7 10:40:19

你好!在你的代码中,你没有完成cout语句。为了输出结果,请添加以下代码:

cout << sum << endl;

这样,你就能正确输出结果啦!完整的代码如下:

#include <iostream>
using namespace std;

int main()
{
    long long sum = (20230408 * 20230409) / 2;
    cout << sum << endl;

    return 0;
}

希望能帮助到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-4-7 11:07:39

本帖最后由 jackz007 于 2024-4-7 11:56 编辑

long long sum = (20230408 * 20230409) / 2;
      编译器会为之部署 32 位乘法,会导致计算结果溢出,应该改为
long long sum = (20230408ll * 20230409ll) / 2;
      编译器会特意为之部署 64 位乘法,计算结果不会溢出。
      'll' 为两个小写的英文字母 'L'

sinychen 发表于 2024-4-7 15:56:41

本帖最后由 sinychen 于 2024-4-7 15:58 编辑

这段代码本身没有语法错误,并且会成功编译和运行。然而,从数值计算的角度来看,这段代码可能会遇到整数溢出的问题。

在C++中,long long类型通常能够存储的整数范围是 -9223372036854775808 到 9223372036854775807。当你计算 20230408 * 20230409 时,结果是 4108690822032572,这确实是在long long类型的范围内。

但是,当你将这个结果除以2时,理论上应该得到 2054345411016286,这个数也仍然是在long long的范围内。然而,问题出在除法运算的精度上。在C++中,整数除法会向下取整,这意味着 4108690822032572 / 2 的结果将是 2054345411016286,但由于整数除法的特性,你可能不会得到预期的结果。

为了避免这种情况,你可以先将乘积转换为double或long double类型,然后再进行除法运算。这样可以确保得到精确的浮点结果,之后再将其转换回long long(如果需要的话)。

这里是修改后的代码示例:

cpp
#include <iostream>
using namespace std;

int main()
{
    // 使用double类型进行计算以避免整数除法的问题
    long long sum = static_cast<long long>((static_cast<double>(20230408) * static_cast<double>(20230409)) / 2);
    cout << sum << endl;

    return 0;
}
在这个修改后的版本中,我们首先将两个整数转换为double类型,进行乘法运算和除法运算,然后再将结果转换回long long类型。static_cast用于执行类型转换。这样可以确保计算的精度,并且避免潜在的整数溢出问题。不过在这个特定的例子中,由于结果仍然在long long的范围内,所以溢出并不是一个问题。
页: [1]
查看完整版本: 输出不对