做多做多错了

long long division wrong

本文关键字:错了      更新时间:2023-10-16

我在一个项目中工作,在某个特定的时间内我遇到了这个问题。我有两个非常大的数字,我想把它们除以,得到一个整数/长整数。这就是正在发生的事情:

代码

#include <iostream>
using namespace std;
int main(){
    long long n,m;
    cin >> n >> m;
    cout << n/m << endl;
}

输入可以是100000000000000000之前的数字,因此除法执行错误。

输出

#1 n: 76543210987654321 m: 7654321
#2 76543210987654321/7654321 = 1410312449

正确答案是10000000130,所以我想知道发生了什么。。。

正确的结果既不是1410312449也不是10000000130。等于10000000129

至少这是GCC在www.ideone.com上展示的内容。你可以自己尝试。

#include <iostream>
int main() 
{
    long long n = 76543210987654321;
    long long m = 7654321;
    std::cout << n / m << std::endl;
    return 0;
}

您似乎将操作的结果放置在类型为int的对象中。考虑以下代码

#include <iostream>
int main() 
{
    long long n = 76543210987654321;
    long long m = 7654321;
    int x;
    x = n / m;
    std::cout << n / m << std::endl;
    std::cout << x << std::endl;
    return 0;
}

输出为

10000000129
1410065537

除法的结果似乎被截断为32位值(int)。尝试通过static_castlong long使用显式强制转换。另外,了解sizeof(long long)在编译器上的结果也很有趣。