36进制数的加法运算

题目:

36进制由0-9,a-z,共36个字符表示,最小为'0'
'0''9'对应十进制的09,'a''z'对应十进制的1035
例如:'1b' 换算成10进制等于 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47
要求按照加法规则计算出任意两个36进制正整数的和
如:按照加法规则,计算'1b' + '2x' = '48'

要求:不允许把36进制数字整体转为10进制数字,计算出10进制数字的相加结果再转回为36进制

思路:

创建一个字符串,

string nums = "0123456789abcdefghijklmnopqrstuvwxyz";


找到两个字符串相加字母  在  字符串nums 中的位置, 这个位置就是字母所表示的大小,例如z:35.  a:10

然后用位置相加,如果相加的结果超过36,则进位;否则不进位。

最后把剩下的字符串加到保存的结果中,翻转结果即可。

string nums = "0123456789abcdefghijklmnopqrstuvwxyz";

string f(string s1, string s2) 
{
	int i = s1.size() - 1;
	int j = s2.size() - 1;
	int temp = 0;// 进位
	string sb;
	while (i >= 0 && j >= 0)
	{
		char c1 = s1[i];
		char c2 = s2[j];
		int index1 = nums.find(c1);
		int index2 = nums.find(c2);
		int sum = index1 + index2 + temp;
		if (sum >= 36) // 如果加起来的和超过36,则要进位
		{
			temp = 1;
			sb += (nums[sum % 36]);
		}
		else
		{ // 没有进位
			temp = 0;
			sb += (nums[sum]);
		}
		i--; 
		j--;
	}

	//如果字符串s1还有剩余
	while (i >= 0) 
	{
		// 将之前加的进位算上, 
		int sum = nums.find(s1[i]) + temp;
		if (sum >= 36) {
			temp = 1;
			sb += (nums[(sum % 36)]);
		}
		else {
			temp = 0;
			sb += (nums[sum]);
		}
		i--;
	}

	// 如果字符串s2还有剩余
	while (j >= 0) 
	{
		int sum = nums.find(s2[j]) + temp;
		if (sum >= 36) 
		{
			temp = 1;
			sb += (nums[sum % 36]);
		}
		else 
		{
			temp = 0;
			sb += (nums[(sum)]);
		}
		j--;
	}
	// 如果最后一位还有进位,再加一个1
	if (temp != 0)
	{
		sb += '1';
	}
	reverse(sb.begin(), sb.end());
	return sb;
}

 

你可能感兴趣的:(GLUTEN)