小马一面凉经

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;
}

全部评论
力扣原题
点赞 回复 分享
发布于 2023-10-26 21:19 广东

相关推荐

昨天 11:08
门头沟学院 Java
投递京东等公司9个岗位
点赞 评论 收藏
分享
06-25 16:25
梧州学院 Java
愿汐_:项目介绍那么长,然而你做了啥就一句话?
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务