110003 - 进制数加法

题解bys00000b 这是一个类似于高精度的算法题,我们可以像竖式一样对其进行加法

基础思路

我们可以想到,小学时学过的转换进制的办法,我们可以真么做,但是本蒟蒻感觉有可能会超时(要转化两次)

算法步骤

1.我们预处理一个保存N进制字符的数组,然后我们直接从中查询来吧N进制数转化为10进制数,或者吧10进制数转化为N进制数

2.对其 ab,方便我们按位来对其加法。然后我们考虑到 可能会进位,所以我们在前面多加一个 0

3.然后我们按位对其进行加法,我们可以定义一个新的数组,或直接用 a,数组的值来覆盖。

这里提供一种在高精中用到的按位加法。

c[lc]+a[lc]+b[lc]+x; x=c[lc]/10; c[lc]%=10; lc++;

然后我们就可以写出代码了

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string a,b,w;
	int x[100],y[100],i,k,N;
	cin>>N;
	for(i=0;i<=N-1;i++)
	{
		if(i<10)
			w=w+char(48+i); //对要用到的数字进行处理
		else
			w=w+char(55+i); // 对字符处理
	}
	cin>>a>>b;
	while(a.length()<b.length())
		a='0'+a;
	while(b.length()<a.length())
		b='0'+b; // 对齐
	a='0'+a;
	b='0'+b; // 前面多加一位用来进位
	for(i=a.length()-1;i>=0;i--)
	{
		x[i]=w.find(a[i],0); //查找a[i]再w中的位置获得对应数字
		y[i]=w.find(b[i],0); //转换到x,y数组中准备相加
	}
	for(i=a.length()-1;i>=0;i--)
	{
		x[i]=x[i]+y[i];
		if(x[i]>=N) //进位
		{
			k=i;
			while(x[k]>=N)
			{
				x[k]=x[k]-N;
				x[k-1]++;
				k--;
			}
		}
	}
	for(i=a.length()-1;i>=0;i--)
		a[i]=w[x[i]]; // 重新转化为N进制数
	while(a[0]=='0') // 删除前导0
		a.erase(0,1);
	cout<<a<<endl;
	return 0; //完结撒花
}