解题思路
这题需要通过高精度加=除法来解决。原本以为高校机试题最多考到高精度的加减法,没想到还会考高精度和低精度的乘除法,不亏是你清的题。
需要注意的是,一开始存储需要是逆序存储,方便后面的操作,同时时刻主要操作的大整数是正序的还是逆序的;对于取余操作,可以通过引用的办法获得,避免出现需要返回两个值的情况。
原本以为复习过一轮《算法笔记》比较稳了,没想到忘记得也差不多了,加油,8月份再过一轮,冲冲冲!
参考代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define MAX 0x3f3f3f3f
#define MIN -0x3f3f3f3f
vector<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;
}