题解 | #大整数的因子#

大整数的因子

https://www.nowcoder.com/practice/3d6cee12fbf54ea99bb165cbaba5823d

#include<iostream>
#include<string>
//大整数减法
std::string Substract(std::string s1, std::string s2)
{
    std::string result;
    int carry = 0;
    int i = s1.length()-1;
    int j = s2.length()-1;

    while(i >= 0 || j >= 0 || carry)//从后往前遍历,依次对应相减
    {
        int x = i >= 0 ? s1[i--] - '0' : 0;//位数不够就赋值为0
        int y = j >= 0 ? s2[j--] - '0' : 0;
        int diff = x - y - carry;
        if(diff < 0)//这里运用了补码的思想,如果小于0说明不够减,加上10为正确结果,同时进位变为1
        {
            diff += 10;
            carry = 1;
        }else{
            carry = 0;//够减则进位为0
        }
        //将相减的结果从头不断加入字符串
        result = std::to_string(diff) + result;
    }
    //移除数字前面的0
    while (result.length() > 1 && result[0] == '0')
    {
        result = result.substr(1);
    }
    return result;
}

//大整数除法
bool divide(std::string dividend, std::string divisor)
{
    std::string quotient;
    std::string reminder = "";
    for(char digit : dividend)
    {
        reminder += digit;//先找到大于除数的部分
        int count = 0;
        while(std::stoi(reminder) >= std::stoi(divisor))
        {
            //除法本质上就是减法,不断相减,直到小于除数
            reminder = Substract(reminder, divisor);
            count++;//每减一次该位的商就加1
        }
        quotient.push_back(count + '0');
    }

    while (quotient.length() > 1 && quotient[0] == '0')
    {
        quotient = quotient.substr(1);
    }
    // if(quotient.empty())
    // {
    //     return "0";
    // }
    while (reminder.length() > 1 && reminder[0] == '0')
    {
        reminder = reminder.substr(1);
    }
    if(reminder == "0" )
    {
        return true;
    }else{
        return false;
    }
}

int main()
{
    std::string s;
    while(std::cin >> s)
    {
        if(s == "-1") break;
        std::string result = "";
        for(int i = 2;i <= 9;i++)
        {
            if(divide(s, std::to_string(i)))
            {
                result = result + std::to_string(i) + " ";
            }
        }
        if(result.empty())
        {
            result = "none";
        }else{
            result.erase(result.length() - 1);
        }
        std::cout << result << std::endl;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 20:15
还能挽救吗?找同学帮忙看了一下&nbsp;字节怎么能如此对我
牛客26396789...:你这是严重红线,被发现你自己永远进不去,你那个同学直接走人,你还敢宣扬
点赞 评论 收藏
分享
点赞 评论 收藏
分享
看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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