首页 > ACM题库 > HDU-杭电 > hdu 2100 Lovekey-高精度-[解题报告]C++
2013
12-29

hdu 2100 Lovekey-高精度-[解题报告]C++

Lovekey

问题描述 :

XYZ-26进制数是一个每位都是大写字母的数字。 A、B、C、…、X、Y、Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26进制数转化成是10进制的规则如下
A0A1A2A3…An-1 的每一位代表的数字为a0a1a2a3…an-1 ,则该XYZ-26进制数的10进制值就为

m = a0 * 26^(n-1) + a1 * 26^(n-2) + … + an-3* 26^2 + an-2*26 + an-1

一天vivi忽然玩起了浪漫,要躲在学校的一个教室,让枫冰叶子去找,当然,她也知道枫冰叶子可不是路痴,于是找到了XYZ的小虾和水域浪子帮忙,他们会在vivi藏的教室的门口,分别写上一个XYZ-26进制数,分别为 a 和 b,并且在门锁上设置了密码。显然,只有找到密码才能打开锁,顺利进入教室。这组密码被XYZ的成员称为lovekey。庆幸的是,枫冰叶子知道lovekey是 a的10进制值与b的10进制值的和的XYZ-26进制形式。当然小虾和水域浪子也不想难为枫冰叶子,所以a 和 b 的位数都不会超过200位。
例如第一组测试数据
a = 0 * 26^5+0* 26^4+ 0* 26^3+ 0 *26^2 + 3*26 + 7 = 85
b = 1*26^2 + 2*26 + 4 = 732
则 a + b = 817 = BFL

输入:

题目有多组测试数据。
每组测试数据包含两个值均为的XYZ-26进制数,每个数字的每位只包含大写字母,并且每个数字不超过200位。

输出:

题目有多组测试数据。
每组测试数据包含两个值均为的XYZ-26进制数,每个数字的每位只包含大写字母,并且每个数字不超过200位。

样例输入:

AAAADH  BCE
DRW  UHD
D  AAAAA

样例输出:

BFL
XYZ
D

 

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

 

解题思路:也是一道进制转换的问题啦,其实把字母转换成10进制后,再转换回26进制,本身就是一个逆过程。根本不用转换成10进制啦,就在26进制的基础上进行加法就是了,相加的和超过25,就进位啦,别被题目的提示给忽悠了。因为是200的长度的字符串,所以啊,就是用到大数相加的思想了。

 

特别注意:数据如果给的是 AAAAAAAAA    *的话最后结果就是*,*是任意一个字母,这是特殊情况,大家要注意啦。

 

 

#include <stdio.h>
#include <string.h>
#define size 202

int main()
{
	char a[size],b[size];
	int c[size];//储存结果
	int alen,blen,i,j,k,len,up;
	int status;//逆序输出时碰到第一个不为A的数就标记下,从这里开始通通都要输出
	while (scanf("%s%s",a,b)!=EOF)
	{
		alen = strlen(a);
		blen = strlen(b);
		memset(c,0,sizeof(c));
		len = 0;
		up = 0;
		k = 0;
		i = alen-1;
		j = blen-1;
		status = 0;
		len = (alen>blen?alen:blen)+1;
		/************************************************************************/
		/*                                大数相加                              */
		/************************************************************************/
		while (len--)
		{
			if (i!=-1&&j!=-1)
			{
				c[k] = a[i]-'A'+b[j]-'A'+up;
				k++;i--;j--;up = 0;
			}
			else if (i!=-1&&j==-1)
			{
				c[k] = a[i]-'A'+up;
				k++;i--;up = 0;
			}
			else if(i==-1&&j!=-1)
			{
				c[k] = b[j]-'A'+up;
				k++;j--;up = 0;
			}
			if (c[k-1]>25)
			{
				c[k-1] = c[k-1]%26;
				up = 1;
			}
			else
				up = 0;
			if (i==-1&&j==-1&&up==1)
			{
				c[k] = 1;
				up = 0;
				k++;
				break;
			}
		}
		for (i=k-1;i>=0;i--)
		{
			if (!status&&c[i]!=0)
				status = 1;
			if (status)
			{
				printf("%c",c[i]+65);
			}
			if (!status&&i==0)//如果说结果是AAAAAAAAA?这种全部都是A的情况的,就要输出?的值
			{
				printf("%c",c[0]+65);
			}
		}
		printf("/n");
	}
	return 0;
}

解题转自:http://blog.csdn.net/q3498233/article/details/4427447


  1. [email protected]

  2. A猴子认识的所有猴子和B猴子认识的所有猴子都能认识,这句话用《爱屋及乌》描述比较容易理解……