zoukankan      html  css  js  c++  java
  • 大数减法

    大数减法

    头条一面的手撕代码题,第一次手撕代码过于紧张,手都在抖,结果一道愚蠢的模拟题都没在时间里做出来,面试官肯定觉得我水平属实8行了qwq

    思路如下,逆序转换成vector数组,预判一下如果是负数就把值都置负,减一个数就是加它的负数嘛,然后全部加起来再处理进位。

    最后处理进位时有个坑,首先找到结果中第一个不为0的,判断它的正负性,如果它为负,那么结果就是负数了,处理进位应该处理成负数。为什么第一个不为0的就已经决定了它的正负性了呢?因为后续借位最多为1,即使第一个已经为最小的正整数1了,也还是可以通过当前位置变成0使得后一位变正

    面试的时候30分钟没写完,下去了10分钟就写完了,我真是服了自己了

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    
    vector<int> prefixb(string a) {
        vector<int> rnt;
        if (a[0] == '-') {
            for (int i = a.size() - 1; i > 0; i--) {
                rnt.push_back(a[i] - '0');
            }
        } else {
            for (int i = a.size() - 1; i >= 0; i--) {
                rnt.push_back(-(a[i] - '0'));
            }
        }
        return rnt;
    }
    
    vector<int> prefixa(string a) {
        vector<int> rnt;
        if (a[0] == '-') {
            for (int i = a.size() - 1; i > 0; i--) {
                rnt.push_back(-(a[i] - '0'));
            }
        } else {
            for (int i = a.size() - 1; i >= 0; i--) {
                rnt.push_back(a[i] - '0');
            }
        }
        return rnt;
    }
    
    void solve(string a, string b) {
        vector<int> av = prefixa(a);
        vector<int> bv = prefixb(b);
        vector<int> ans;
        int i = 0;
        while (av.size() < bv.size()) {
            av.push_back(0);
        }
        while (av.size() > bv.size()) {
            bv.push_back(0);
        }
        for (; i < av.size(); i++) {
            ans.push_back(av[i] + bv[i]);
        }
        ans.push_back(0);
        i = ans.size() - 1;
        while (i >= 0 && ans[i] == 0) {
            i--;
        }
        if (ans[i] > 0) {
            for (int i = 0; i < ans.size() - 1; i++) {
                int t = 0;
                while (ans[i] < 0) {
                    t--;
                    ans[i] += 10;
                }
                while (ans[i] >= 10) {
                    t++;
                    ans[i] -= 10;
                }
                ans[i + 1] += t;
            }
        } else {
            for (int i = 0; i < ans.size() - 1; i++) {
                int t = 0;
                while (ans[i] <= -10) {
                    t--;
                    ans[i] += 10;
                }
                while (ans[i] > 0) {
                    t++;
                    ans[i] -= 10;
                }
                ans[i + 1] += t;
            }
        }
        int j = ans.size() - 1;
        while (j >= 0 && ans[j] == 0) {
            j--;
        }
        if (j == -1) {
            cout << 0 << endl;
        } else {
            if (ans[j] < 0) {
                cout << '-';
            }
            while (j >= 0) {
                cout << abs(ans[j]);
                j--;
            }
            cout << endl;
        }
    }
    int main(void) {
        string a;
        string b;
        cin >> a >> b;
        solve(a, b);
        return 0;
    }
    
  • 相关阅读:
    MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除
    Eclipse常用快捷键
    UDP 通信
    HDU 3571 N-dimensional Sphere(高斯消元 数论题)
    【机器学习】SVM核函数
    获取CentOS软件源中的updates包
    13年7月13日CF练习 Codeforces Round #147 (Div. 2)
    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器
    .net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。
    庖丁图解八皇后问题
  • 原文地址:https://www.cnblogs.com/hermitgreen/p/12854270.html
Copyright © 2011-2022 走看看