ackwz 2021-12-02 09:08 采纳率: 75%
浏览 89
已结题

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

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

img

img

  • 写回答

2条回答 默认 最新

  • 索利亚噶通 2021-12-02 09:58
    关注

    应该先对比例进行化简,避免越界, 如果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;
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月10日
  • 已采纳回答 12月2日
  • 创建了问题 12月2日

悬赏问题

  • ¥15 解决websocket跟c#客户端通信
  • ¥30 Python调用dll文件输出Nan重置dll状态
  • ¥15 浮动div的高度控制问题。
  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴