【hdoj_2100】Lovekey(大数+字符处理)

守給你的承諾、 提交于 2020-04-04 22:32:56

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2100


根据题目意思,现将字符串转化为10进制,再采用10进制加法相加,再转化为26进制.

另一种直接的思路是:采用26进制,模拟加法过程.


思路:用字符串存储两个26进制的数,然后在前面补A(相当于十进制中的0),使两个数对齐,以便进行加法进位.对齐之后,采用26进制,进行加法运算,运算得到的数字,再转化为对应的字符,即可.

C++代码如下:

#include<iostream>
#include<string>
#include<string.h>
using namespace std;

int main()
{
	string s1,s2;
	int i,j;
	while(cin >> s1 >> s2)
	{
		int len_1 = s1.length();
		int len_2 = s2.length();
		if(len_1<len_2)
		{
			s1.swap(s2);
			int temp = len_1;
			len_1 = len_2;
			len_2 = temp;
		}
		s1 = 'A' + s1;
		for(i=len_2;i<=len_1;i++)
			s2 = 'A'+ s2;
		//至此,s1和s2已经对齐了,并且前面至少都有一个A,用于进位

		int len = s1.length();
		int c = 0;
		for(i=len-1;i>=0;i--)
		{
			int x = s1[i] - 'A';//获取字符 s1[i]对应的数字,如s1[i] = 'C',则s[i]-'A' = 2;
			int y = s2[i] - 'A';
			
			c += (x+y);
			s1[i] = (c%26) + 'A';//结果存储在 s1中
			c /= 26;
		}
		
		for(i=0;i<len;i++)
			if(s1[i]!='A')//输出的时候,前导A不输出
				break;
		for(j=i;j<len;j++)
			cout << s1[j];
		cout << endl;
	}

	return 0;
}
上述代码,提交可以通过.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!