机试真题2 进制转换 高精度除法

题目链接

解题思路
这题需要通过高精度加=除法来解决。原本以为高校机试题最多考到高精度的加减法,没想到还会考高精度和低精度的乘除法,不亏是你清的题。
需要注意的是,一开始存储需要是逆序存储,方便后面的操作,同时时刻主要操作的大整数是正序的还是逆序的;对于取余操作,可以通过引用的办法获得,避免出现需要返回两个值的情况。
原本以为复习过一轮《算法笔记》比较稳了,没想到忘记得也差不多了,加油,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值