HDU 2100 Lovekey

 

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; }

你可能感兴趣的:(HDU 2100 Lovekey)