c++数据溢出问题,n最大为10^20

请问代码有什么问题,提交后只有73分

img

img

应该先对比例进行化简,避免越界, 如果a比n大, 比如n = 20, a:b = 100:200, 那么计算结果就是20 / 100 * 200 = 0, 但实际结果是40(有用点个采纳)


#include <iostream>
using namespace std;

// 辗转相除法 
unsigned long long int getLCM(unsigned long long int a, unsigned long long int b)
{
    int max = (a > b ? a : b);
    int min = (a < b ? a : b);
    int res = max % min;
    while (res)
    {
        max = min;//小的给大的
        min = res;//余数给小的
        res = max % min;
    }
    return min;//整除返回小的
}

int main(){
    unsigned long long int n, a, b, least_common_multiple, res;     
    char c;
    cin >> n >> a >> c >> b;
    // 先将比例化简, 减小乘积之后的结果
    // 找a, b的最小公倍数 
    least_common_multiple = getLCM(a, b);
    a /= least_common_multiple;
    b /= least_common_multiple;
    
    res = n / a * b;
    cout << res; 
    
    return 0;
} 

unsigned long long的最大值:18446744073709551615