2-36进制的 两个数相加

2-36进制的 两个数相加  数的长度可以无限制  

问题来源:华为编程大赛 二师弟的星际加法

输入:

N  进制数

str1 第一个数字字符串

str2 第二个数字字符串

输出:

str1和str2按照N进制相加的数字字符串结果


#include <iostream>
#include <string.h>

using namespace std;

char Add(char num1,char num2,int *supply,int jinzhi);


// N>=2  N<=36
int main()
{

	char str1[100],str2[100],sum[100]={'0'};
	int N,len1,len2,len;
	int i,j,k;
	int supply = 0;//记录低位向高位的进位

	cin>>N;
	cin>>str1;
	cin.get();
	cin>>str2;
	len1 = strlen(str1);
	len2 = strlen(str2);
	len = len1>len2?len1:len2;
	k = len;

	for(i=len1-1,j=len2-1;i>=0&&j>=0;i--,j--,k--)
		sum[k] = Add(str1[i],str2[j],&supply,N);

	if(j<0&&i>=0)//len1>len2
	{
		for(;i>=0;i--,k--)
			sum[k] = Add(str1[i],'0',&supply,N);//
	}
	if(i<0&&j>=0)//len1<len2
	{
		for(;j>=0;j--,k--)
			sum[k] = Add('0',str2[j],&supply,N);
	}

	if(supply == 1)//45+55=100
		sum[k] = '1';

	if(sum[0]=='0')//100+100 = 0200
		cout<<sum+1<<endl;
	else//45+55 = 100
		cout<<sum<<endl;

	return 0;
}

char Add(char num1,char num2,int *supply,int jinzhi)
{
	char data_array[37] = {'0'};
	int data1,data2,data;
	int i;
	for(i = 0;i<=9;i++)
		data_array[i] = '0'+i;
	for(i = 10;i<=35;i++)
		data_array[i] = 'a'+i-10;

	

	if(num1>='0'&&num1<='9')
		data1 = 0+num1-'0';
	if(num1>='a'&&num1<='z')
		data1 = 10+num1-'a';
	if(num2>='0'&&num2<='9')
		data2 = 0+num2-'0';
	if(num2>='a'&&num2<='z')
		data2 = 10+num2-'a';

//	cout<<"data1:"<<data1<<","<<"data2:"<<data2<<endl;

	data = data1+data2+(*supply);// + (*suppply)
	if(data>=jinzhi)//>=
	{
		*supply = 1;
		data = data-jinzhi;
	}
	else
		*supply = 0;//

	//cout<<"data_index:"<<data<<endl;

	return data_array[data];
}


//eg:36进制   z+1 = 10  

运行例子:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值