分数转字符串形式的浮点数

分数转浮点数

如:

1 / 5 = 0.2

1 / 3 = 0.(3)

11 / 90 = 0.1(2)

numerator: 分子

denominator: 分母

std::string fraction2string(int numerator, int denominator)
{
	if (denominator == 0)
	{
		return "";
	}
	if (numerator == 0)
	{
		return "0";
	}
	bool posFlag = false;
	if ((numerator > 0 && denominator < 0)
		|| (numerator < 0 && denominator > 0))
	{
		posFlag = true;
	}
	std::string result = "";
	if (posFlag)
	{
		result = '-';
	}
	if (numerator < 0)
	{
		numerator = 0 - numerator;
	}
	if (denominator < 0)
	{
		denominator = 0 - denominator;
	}
	// 1. 取整数部分
	int n = numerator / denominator;
	result += std::to_string(n);
	// 2. 余数部分
	int m = numerator % denominator;
	if (m == 0)
	{
		return result;
	}
	result += ".";
	/* 以下三个变量为了记录可能的需要插入 ( 的位置 */
	int idx = -1;
	int off = result.size();
	int cnt = 0;
	/* 当不断 * 10 然后 / 分母时,不断记录余数,
	 * 一旦余数出现重复,那么表示开始了循环
	 * 那么此时便可break循环,此外,需要记录开始的索引位置,
	 * 用于记录 插入 ( 的位置 */
	std::unordered_map<int, int> map;
	while (true)
	{
		map[m] = cnt++;
		m *= 10;
		n = m / denominator;
		m = m % denominator;
		if (m == 0)
		{
			result += std::to_string(n);
			// break;
			// 此时可以直接 return
			return result;
		}
		result += std::to_string(n);
		if (map.find(m) != map.end())
		{
			idx = map[m];
			result += ")";
			break;
		}
	}
	//if (idx != -1) // 无循环下被 return, 此时无需判断 idx 为 -1 选项
	{
		result.insert(idx + off, 1, '(');
	}
	return result;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值