小马一面凉经

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 广东

相关推荐

👥&nbsp;面试题目有些焦虑,写个面经积积德二面其实在一面之后四个小时就发了,但是那几天一直在忙毕设,就推到昨天才进行,一面内容可以看我之前的帖子时间:2024/3/26&nbsp;&nbsp;&nbsp;10:40时长:约40min说在前面:我其实是做Java后端的,跟嵌入式根本不对口,因此我在自我介绍的时候一直在强调我不会嵌入式但我入职上手没问题,学习能力强、抗压能力强巴拉巴拉的,然后把项目能体现我能力的部分着重讲了,面试官虽然不懂技术但是也是表示了认可自我介绍项目进程间通信方式,为什么要进行通信内核态与用户态,为什么要设置这两种状态内存管理,不太会,没回答Redis方面问了优缺点和单线程的优缺点输入URL访问页面的过程中使用到了哪些协议?作用是什么c语言问了一点,但我确实不懂,把能听懂的用Java解释了一遍手撕算法:给定二叉树,求最大路径长,要求路径上每个结点的值都相等,不必包含根节点先给思路,用递归,然后Java代码实现,有点紧张,递归写的有点瑕疵反问多久出结果?后续流程(我会第一时间上传面试结果,后续是终面加座谈,如果通过的话hr会安排时间)对我的评价和建议(笑了一下,基础和编码能力都还不错,建议学点嵌入式相关和c语言)三小时后安排第二天下午终面,看群里都是一个时间,应该是刚好赶上这一批,祝我好运明天更新终面面经终面没过,不写面经了,对不起2024/4/26&nbsp;更新终面凉经,在新帖
点赞 评论 收藏
转发
1 3 评论
分享
牛客网
牛客企业服务