牛客网-10进制 VS 2进制【进制转换,大数加法】

在这里插入图片描述
发现NK收录的题好多大数的,vector快给我写炸了。将一个数转化为二进制表示:

  1. 整体除以2,余数为几就将其存入一个vector,vector从低位到高位就是转化后的二进制数。
  2. 得到了二进制数,将整个vector reverse操作,然后去除前导0,得到转化后的vector。
  3. 将转化后的vector从高位到低位遍历,存储一个base的数组,每次遍历base=base+base(二进制该位的权重),如果该位为1,那么res数组与base数组相加。
#include<iostream>
#include<string>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;

#define ll int
#define MAX 1000
#define inf 0x3fffff

//v1+v2=v
vector<ll> add(vector<ll> v1, vector<ll> v2) {
	ll l1 = v1.size(), l2 = v2.size();
	if (l1 > l2) { swap(v1, v2); swap(l1, l2); }//v1始终是位数比较少的那个
	vector<ll> v(l2);
	ll res = 0, mod = 0;
	for (int i = 0; i < l1; i++) {
		res = v1[i] + v2[i] + mod;
		v[i] = res % 10; mod = res / 10;
	}
	for (int i = l1; i < l2; i++) {
		res = mod + v2[i];
		v[i] = res % 10; mod = res / 10;
	}
	if (mod != 0)v.push_back(mod);
	return v;
}


int main() {
	ll l;
	string L;
	while (cin >> L) {
		vector<ll> b, d, base, res;
		for (int i = L.size() - 1; i >= 0; i--) {
			d.push_back(L[i] - '0');
		}
		l = d.size();
		while (!(d.size() == 1 && d[0] == 1)) {//只剩下了一位数 并且除的剩下了1
			ll res = 0, mod = 0;
			for (int i = d.size() - 1; i >= 0; i--) {
				if (d[i] + 10 * mod < 2) { mod = d[i], d[i] = 0; continue; }//向下进位
				res = (d[i] + 10 * mod) / 2;
				mod = (d[i] + 10 * mod) % 2;
				d[i] = res;
			}
			if (d[d.size() - 1] == 0)d.pop_back();
			b.push_back(mod);
		}
		b.push_back(1);
		ll k = b.size() - 1;
		reverse(b.begin(), b.end());
		while (b[k--] == 0)b.pop_back();//略去前导0,最后是低位
		res.clear(); base.clear(); base.push_back(1);//base是遍历二进制时的基数
		for (int j = 0; j < b.size(); j++) {
			if (b[j])res = add(res, base);
			base = add(base, base);//基数*2
		}
		for (int i = res.size() - 1; i >= 0; i--)cout << res[i];
		cout << endl;
	}
}
发布了269 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105636495