题目链接
解题思路
这题需要通过高精度加=除法来解决。原本以为高校机试题最多考到高精度的加减法,没想到还会考高精度和低精度的乘除法,不亏是你清的题。
需要注意的是,一开始存储需要是逆序存储,方便后面的操作,同时时刻主要操作的大整数是正序的还是逆序的;对于取余操作,可以通过引用的办法获得,避免出现需要返回两个值的情况。
原本以为复习过一轮《算法笔记》比较稳了,没想到忘记得也差不多了,加油,8月份再过一轮,冲冲冲!
参考代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define MAX 0x3f3f3f3f
#define MIN -0x3f3f3f3fvector<int> divide(vector<int> num, int b, int &r)
{//此时是逆序的数vector<int> C;for (int i = num.size() - 1; i >= 0; i--){r = r * 10 + num[i];C.emplace_back(r / b);r = r % b;}reverse(C.begin(), C.end());while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{ios::sync_with_stdio(false);string s;while (cin >> s){if (s == "0"){cout << 0 << endl;continue;}reverse(s.begin(), s.end());vector<int> str;for (int i = 0; i < s.size();i++) str.emplace_back(s[i] - '0');vector<int> ans;while (!(str[0] == 0 && str.size() == 1)){int r = 0;str = divide(str, 2, r);ans.emplace_back(r);}for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i];cout << endl;}return 0;
}