166. 分数到小数/C++

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

在这里插入图片描述

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;
}
在C/C++中,将小数转换成最简分数通常涉及到两个步骤:首先需要将小数表示为分数形式,然后简化这个分数。这可以使用长除法思想,并借助于一些数学库函数或者自定义算法实现。 1. **将小数转换为分数**: - 首先找到一个小数的等分点,例如如果小数0.625,它的第一个整数部分是1,余数是0.625,这时相当于分子(也就是小数乘以等分点的次数)是1,分母是10的指数,这里是3。 - 将这个余数作为新的小数,继续上面的过程直到余数小于等于0.01(或其他预设的小阈值),得到的分子就是整个过程中小数的累积部分,分母就是之前所有分母的乘积。 2. **简化分数**: - 使用最大公约数(GCD)算法来消除分数中的公共因子。GCD函数用于找出两个数的最大公因数,对于分数而言,就是分子和分母的最大公因数,然后用分子除以GCD,用分母除以GCD,这样就得到了最简分数的形式。 下面是一个简单的伪代码示例: ```cpp int gcd(int a, int b) { return (b == 0) ? a : gcd(b, a % b); } void decimalToFraction(double decimal, int &numerator, int &denominator) { int wholePart = static_cast<int>(decimal); double fracPart = decimal - wholePart; numerator = static_cast<int>(fracPart * pow(10, decimalDigits)); while (numerator != 0) { int newDenominator = denominator * 10; int quotient = numerator / denominator; numerator %= denominator; // 计算新分数的分子 denominator = newDenominator; // 更新分母 if (numerator == 0) break; // 简化分数 numerator /= gcd(numerator, denominator); denominator /= gcd(numerator, denominator); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值