一个功能不完善的大数计算模板

//一个大数乘一个int
//返回num1 * num2
vector<int> multiply(const vector<int> &num1, int num2) {
    int carry = 0;    //记录进位
    vector<int> ans;    //记录答案
    for (int i = 0; i < num1.size() || carry != 0; ++i) {
        //如果还在num1的范围内,和num1相乘一位
        if (i < num1.size()) {
            carry += num1[i] * num2;
        }
        ans.push_back(carry % 10);
        carry /= 10;
    }
    return ans;
}

//一个大数除一个int
//返回 num1 / num2
vector<int> divide(const vector<int> &num1, int num2) {
    int temp = 0; //工具人变量,用来做除法
    vector<int> ans;    //记录答案
    //倒着循环,因为大数是倒着记的
    for (int i = num1.size() - 1; i >= 0; --i) {
        temp = temp * 10 + num1[i];
        ans.push_back(temp / num2);
        temp %= num2;
    }
    //因为大数是倒着记的,所以输出的答案也要倒过来,顺便把前面多出来的0删掉
    reverse(ans.begin(), ans.end());
    while (ans.back() == 0 && ans.size() > 1) {
        ans.pop_back();
    }
    return ans;
}

//判断num1是否大于num2
bool operator>(const vector<int> &num1, const vector<int> &num2) {
    //如果num1和num2位数不同,位数多的数更大
    if (num1.size() != num2.size()) {
        return num1.size() > num2.size();
    }
    for (int i = num1.size() - 1; i >= 0; --i) {
        if (num1[i] != num2[i]) {
            return num1[i] > num2[i];
        }
    }
    return false;
}

//输出大数
ostream &operator<<(ostream &output, vector<int> &num) {
    for (int i = num.size() - 1; i >= 0; --i) {
        output << num[i];
    }
    return output;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务