166. 分数到小数/C++

本文深入探讨了将任意整数分子与分母转换为小数形式的算法实现,特别关注于循环小数的处理机制。通过使用C++语言,详细介绍了如何避免整数溢出,如何判断和插入循环小数的括号,以及如何处理正负号。适用于对数据类型转换和循环小数识别感兴趣的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

string fractionToDecimal(int numerator, int denominator) {
    if(numerator==0)
        return "0";
    
    string res;
    
    //添加负号
    if(numerator>0 ^ denominator>0)
        res+="-";
    
    //转成long long避免INT_MIN/-1溢出
    long long llnumerator = abs(static_cast<long long>(numerator));
    long long lldenominator = abs(static_cast<long long>(denominator));
    res+=to_string(llnumerator/lldenominator);
    long long remainder = llnumerator % lldenominator;
    
    //如果整除就直接返回
    if(remainder == 0)
        return res;
    
    //添加小数点
    res+=".";
    
    //存储余数与对应的位数
    unordered_map<long long, int> map;
    while(remainder){
    	//如果余数是之前出现过的,就说明是循环小数,在之前出现过的地方插入左括号
        if(map.find(remainder)!=map.end()){
            res.insert(map[remainder],"(");
            res+=")";
            break;
        }
        map[remainder]=res.size();
        remainder*=10;
        res+=to_string(remainder/lldenominator);
        remainder %= lldenominator;
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值