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
运行例子: