C++程序:将两个数字的分数表示为字符串格式
给定两个整数分子和一个分母。我们需要将这两个整数的分数表示为字符串格式。如果某个小数是循环的,我们需要用括号来表示其循环序列。
算法(步骤)
以下是执行所需任务的算法/步骤:
在确定小数部分之前,先确定整数商(小数点前的绝对部分)。
将余数(分子 % 分母)放入映射中,键为余数,值为该余数出现的索引位置,以查看小数部分是否重复。
如果在任何时刻余数为零,则不存在重复小数。
如果余数已在映射中出现,则存在重复小数。
示例
假设一个整数为分子'8',另一个整数为分母'6'。
int numerator = 8, denominator = 6; res = solve(numerator, denominator);
所以分数是 8/6,也就是 1.333... 所以我们需要输出 "1.(3)"。括号表示重复的小数部分,如果没有重复部分,则直接输出字符串值。
我们首先可以计算整数部分并将其保存在字符串中。之后,我们可以使用余数找到小数部分,直到它变为 0 或直到我们找到一个重复序列。为了找到重复序列,我们可以将余数存储在映射中,如果我们在映射中碰巧看到相同的余数,我们可以确定该序列是重复的。映射中的值部分将是该小数第一次出现的索引,以便我们可以在该索引处放置括号。
#include <iostream> #include <map> using namespace std; string solve(int numerator, int denominator) { if (numerator == 0) { return "0"; } if(denominator == 0) { return "INFINITY"; } string ans = ""; if ( ((numerator < 0) ^ (denominator < 0)) ) { ans+="-"; } numerator = abs(numerator); denominator = abs(denominator); ans+=to_string(numerator/denominator); if(numerator%denominator == 0) return ans; ans+="."; int remainder = numerator % denominator; map<int, int> mp; while (remainder > 0) { if (mp.find(remainder) != mp.end()) { ans += ")"; ans.insert(mp[remainder], "("); break; } else { mp[remainder] = ans.size(); } remainder*=10; ans+= to_string(remainder/denominator); remainder = remainder % denominator; } return ans; } int main() { int numerator = 8, denominator = 6; cout << solve(numerator, denominator) << endl; return 0; }
输出
1.(3)
结论
我们可以看到,使用映射作为哈希来查找重复的余数,并存储我们可以再次开始序列的索引作为键值对中的值,这使得跟踪和查找答案变得容易得多。这个问题需要使用正确的数据结构和一些观察。
广告