[leetcode] Fraction to Recurring Decimal

本文介绍了一种算法,用于将给定的整数分数转换为字符串形式,包括整数部分和循环小数部分。通过使用哈希映射记录余数及其位置,算法能够准确地识别循环节,并在输出中用括号表示。

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

From:https://leetcode.com/problems/fraction-to-recurring-decimal/#

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".
class Solution {
public:
	string fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) return "0";
        if (denominator == 0) return "";
        
        string ans = "";
        if ((numerator < 0) ^ (denominator < 0)) ans += "-"; //如果结果为负数
        long long int num = numerator, den = denominator; //转正
		num = abs(num);
		den = abs(den);
        
		//整数部分
		ans += to_string(num / den);
        
        long long int rem = num % den;
        if (rem == 0) return ans; //如果能够整除,返回结果
        
        //小数部分
        map<long long, int> mp;
        ans += ".";
        while (rem != 0) {
            //如果前面已经出现过该余数,那么将会开始循环
            if (mp.find(rem) != mp.end()) {
                int start = mp[rem]; //循环体开始的位置
				string part1 = ans.substr(0, start);
                string part2 = ans.substr(start, ans.length());
                ans = part1 + "(" + part2 + ")";
                return ans;
            }
            mp[rem] = ans.length();
            rem *= 10;
			ans += to_string(rem/den);
            rem = rem % den;
        }
        
        return ans;
    }
};

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if (denominator == 0) {
        	return "";
        }
		if (numerator == 0) {
			return "0";		
		}
          
        StringBuilder ans = new StringBuilder();  
        if ((numerator < 0) ^ (denominator < 0)) {
        	ans.append('-'); //如果结果为负数  
        }
        long num = numerator, den = denominator; //转正  
        num = Math.abs(num);  
        den = Math.abs(den);  
          
        //整数部分  
        ans.append(String.valueOf(num / den));
        
        long rem = num % den;  
        if (rem == 0) {
        	return ans.toString(); //如果能够整除,返回结果  
        }
          
        //小数部分  
        Map<Long, Integer> mp = new HashMap<Long, Integer>();  
        ans.append('.');  
        while (rem != 0) {  
            //如果前面已经出现过该余数,那么将会开始循环  
            if (mp.containsKey(rem)) {  
                int index = mp.get(rem); //循环体开始的位置  
                String part1 = ans.substring(0, index);
                String part2 = ans.substring(index);  
                return part1 + "(" + part2 + ")";  
            }  
            mp.put(rem, ans.length());  
            rem *= 10;  
            ans.append(rem/den);
            rem = rem % den;  
        }  
          
        return ans.toString();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值