小马一面凉经
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;
}