华为编程大赛--二师弟的星际加法


#include <iostream>
#include <string>

bool isValid(std::string s, int N)
{
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] >= 'a')
		{
			if (s[i] - 'a' + 10 >= N)
			{
				return false;
			}	
		}
		else
		{
			if (s[i] - '0' >= N)
			{
				return false;
			}
		}
	}
	return true;
}

//进制转换
int nTransform(char s, int &temp)
{
	if (s >= 'a')
	{
		temp = s -'a' + 10;
	}
	else
	{
		temp = s - '0';
	}
	return 0;
}

int tenToN(std::string &result, int &count, int addTemp, int N)
{
	if (addTemp >= N)
	{
		addTemp = addTemp - N;
		if (addTemp >= 10)
		{
			result[count] = addTemp - 10 + 'a';
		}
		else
		{
			result[count] = addTemp + '0';
		}
		result[++count] = '1';
	}
	else
	{
		if (addTemp >= 10)
		{
			result[count] = addTemp - 10 + 'a';
		}
		else
		{
			result[count] = addTemp + '0';
		}
		++count;
	}

	return 0;
}

int main()
{
	int N;
	std::string s1, s2;
	std::cin>>N>>s1>>s2;
	std::string result(100, '0');

	//判断输入的是否合法
	if (!isValid(s1, N) || !isValid(s2, N))
	{
		return -1;
	}

	//N进制相加
	int addTemp, s1Temp, s2Temp, resultTemp, count = 0;
	for (int i = s1.size() - 1, j = s2.size() - 1; i >= 0 &&j >= 0; i--, j--)
	{
		//进制转换
		nTransform(s1[i], s1Temp);
		nTransform(s2[j], s2Temp);
		nTransform(result[count], resultTemp);

		//计算转为10进制的结果
		addTemp = s1Temp + s2Temp + resultTemp;

		//将10进制结果转为N进制进行保存
		tenToN(result, count, addTemp, N);	
	}


	if (s1.size() > s2.size())
	{
		for (int i = s1.size() - s2.size() -1; i >=0; i--)
		{
			nTransform(s1[i], s1Temp);
			nTransform(result[count], resultTemp);
			addTemp = s1Temp + resultTemp;
			tenToN(result, count, addTemp, N);
		}
	}
	else 
	{
		for (int i = s2.size() - s1.size() -1; i >=0; i--)
		{
			nTransform(s2[i], s2Temp);
			nTransform(result[count], resultTemp);
			addTemp = s2Temp + resultTemp;
			tenToN(result, count, addTemp, N);
		}
	}
	
	int m = result.size() - 1;
	while(result[m] =='0')
	{
		m--;
	}
	for (; m>=0; m--)
	{
		std::cout<<result[m];
	}
	return 0;



}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值