C++程序:显示有理数的十进制表示
假设我们有两个数字,分别称为分子和分母,它们以(分子/分母)的形式表示一个有理数。我们必须找到它的十进制表示形式(字符串)。如果有一些重复的数字,则用括号将它们括起来。
因此,如果输入为分子 = 164,分母 = 3,则输出为“54.(6)”。
为了解决这个问题,我们将遵循以下步骤:
- 如果分子等于0,则:
- 返回“0”
- 定义一个数组ans
- 如果分子 < 0 且分母 > 0 或分子 > 0 且分母 < 0,则:
- 在ans的末尾插入'-'
- 除数 := |分子|
- 被除数 := |分母|
- 余数 := 除数 mod 被除数
- x := 将(除数 / 被除数)转换为字符串
- 对于初始化 i := 0,当 i < x 的大小,更新 (i 增加 1),执行:
- 在ans的末尾插入x[i]
- 如果余数等于0,则:
- 返回ans作为字符串
- 在ans的末尾插入'.'
- 定义一个映射m
- 当余数不等于0时,执行:
- 如果余数不在m中,则:
- 将(ans的第一个元素连接 '(')插入ans
- 在ans的末尾插入')'
- 退出循环
- 否则:
- m[余数] := ans的大小
- 余数 := 余数 * 10
- 在ans的末尾插入(余数 / 被除数)连接'0'
- 余数 := 余数 mod 被除数
- 如果余数不在m中,则:
- 返回ans作为字符串
示例
让我们看看下面的实现来更好地理解:
#include <bits/stdc++.h> using namespace std; class Solution { public: string solve(int numerator, int denominator) { if (numerator == 0) return "0"; vector<char> ans; if (numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0) ans.push_back('-'); long divisor = labs(numerator); long dividend = labs(denominator); long remainder = divisor % dividend; string x = to_string(divisor / dividend); for (int i = 0; i < x.size(); i++) { ans.push_back(x[i]); } if (remainder == 0) { return string(ans.begin(), ans.end()); } ans.push_back('.'); map<int, int> m; while (remainder != 0) { if (m.find(remainder) != m.end()) { ans.insert(ans.begin() + m[remainder], '('); ans.push_back(')'); break; } else { m[remainder] = ans.size(); remainder *= 10; ans.push_back((remainder / dividend) + '0'); remainder %= dividend; } } return string(ans.begin(), ans.end()); } }; string solve(int numerator, int denominator) { return (new Solution())->solve(numerator, denominator); } int main() { cout << solve(164, 3); }
输入
164, 3
输出
54.(6)
广告