http://acm.hdu.edu.cn/showproblem.php?pid=2100
解题思路:也是一道进制转换的问题啦,其实把字母转换成10进制后,再转换回26进制,本身就是一个逆过程。根本不用转换成10进制啦,就在26进制的基础上进行加法就是了,相加的和超过25,就进位啦,别被题目的提示给忽悠了。因为是200的长度的字符串,所以啊,就是用到大数相加的思想了。
特别注意:数据如果给的是 AAAAAAAAA *的话最后结果就是*,*是任意一个字母,这是特殊情况,大家要注意啦。
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;
}