首页 > 代码库 > HDU -2100-Lovekey
HDU -2100-Lovekey
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2100
这题开始一直想着先把26进制转换成10进制,在转换成26进制,又200个字符因而行不通,
直接卡死了,不会做,后来才知道因为是200的长度的字符串,所以啊,就是用到大数相加的思想了。
引用http://blog.csdn.net/q3498233/article/details/4427447的思路
解题思路:也是一道进制转换的问题啦,其实把字母转换成10进制后,再转换回26进制,本身就是一个逆过程。根本不用转换成10进制啦,就在26进制的基础上进行加法就是了,相加的和超过25,就进位啦,别被题目的提示给忽悠了。因为是200的长度的字符串,所以啊,就是用到大数相加的思想了
特别注意:数据如果给的是 AAAAAAAAA *的话最后结果就是*,*是任意一个字母,这是特殊情况,大家要注意啦。
将字符串逆序,为计算方便,将长度比较少的那个字符串后面补零,,最后逆序输出即可。
我的AC代码
#include<stdio.h>
#include<string.h>
char a[210],b[210],c[210],d[210];
int main(void)
{
int i,p,q,n,s;
while(scanf("%s%s",c,d)==2)
{
p=strlen(c);
q=strlen(d);
for(i=p-1;i>=0;i--)
a[p-1-i]=c[i];
a[p]=‘\0‘;
for(i=q-1;i>=0;i--)
b[q-1-i]=d[i];
b[q]=‘\0‘;
n=p;
if(p<q)
{
for(i=p;i<q;i++)
a[i]=‘A‘;
a[i]=‘\0‘;
n=q;
}
if(p>q)
{
for(i=q;i<p;i++)
b[i]=‘A‘;
a[i]=‘\0‘;
n=p;
}
s=0;
for(i=0;i<n;i++)
{
a[i]=a[i]+b[i]+s-‘A‘;
if(a[i]>‘Z‘)
{
s=1;
a[i]=a[i]-26;
}
else
s=0;
}
if(s==1)
{
a[i]=‘B‘;
n++;
}
for(i=n-1;i>=0;i--)
{
if(a[i]==‘A‘)
n--;
else
break;
}
for(i=n-1;i>=0;i--)
printf("%c",a[i]);
printf("\n");
}
return 0;
}
题目得多做多思考,才有进步。