小马一面凉经
10.17一面,已挂
手撕没撕出来
题目
实现一个除法器,以字符串形式输出除法结果,如果有循环则用括号括住循环部分。
Solution
写的时候没有把整数部分和小数部分分开来算,导致逻辑非常冗余,实际上计算小数部分时被除数一定小于除数,而整数部分可以直接通过除法来实现,因此这样分开更简单。
#include <iostream> #include <string> #include <unordered_map> std::string divide(int numerator, int denominator) { if (numerator == 0) return "0"; if (denominator == 0) return "Division by zero is undefined"; std::string result; // Determine the sign of the result if ((numerator < 0) ^ (denominator < 0)) result += "-"; long long num = std::abs(static_cast<long long>(numerator)); long long den = std::abs(static_cast<long long>(denominator)); // Append the integral part of the division result += std::to_string(num / den); num %= den; if (num == 0) return result; // Prepare for fractional part result += "."; std::unordered_map<long long, int> seenRemainders; std::string fraction; // Long division algorithm while (num != 0) { if (seenRemainders.find(num) != seenRemainders.end()) { // Loop detected fraction.insert(seenRemainders[num], "("); fraction += ")"; break; } seenRemainders[num] = fraction.size(); num *= 10; fraction += std::to_string(num / den); num %= den; } result += fraction; return result; } int main() { std::cout << divide(1, 2) << std::endl; // 0.5 std::cout << divide(2, 1) << std::endl; // 2 std::cout << divide(2, 3) << std::endl; // 0.(6) std::cout << divide(22, 7) << std::endl; // 3.(142857) std::cout << divide(-50, 8) << std::endl; // -6.25 return 0; }