您的位置:首页 > 其它

Hdu 2100 Lovekey 模拟大数相加<进位转换..>

2012-08-07 16:18 399 查看
[b]题意:[/b]

用A~Z表示0~25..

给出2个200以内的XYZ-26进制数..即a0 a1 a2 a3……an

求出和..用XYZ-26进制表示..

其中XYZ-26 -> 10进制是m = a0 * 26^(n-1) + a1 * 26^(n-2) + … + an-3* 26^2 + an-2*26 + an-1

[b]思路:[/b]

不用进行转换然后相加再换回去..

直接相加..

模拟进位..

[b]Tips:[/b]

※可以直接把短的加到长的字符串上..eg:ABC+CD就是 ABC

                         + CD

                       ------------

                          BFL

※ 主要是进位的时候要考虑清楚..

※ 在长字符串上处理..就不用担心不知道该在前面保留多少位的问题了..

※ 输出去前导无意义 ‘A' 的时候要考虑到AAAAA的情况..最后输出'A'

[b]Code:[/b]

View Code

#include <stdio.h>
#include <cstring>

void add(char *a, char *b)
{
int i, j, k;
int len1, len2;
int tmp=0;
len1 = strlen(a), len2 = strlen(b);
for(i = len1-1, j = len2-1; i >= 0;){
if(j >= 0){
a[i] = a[i] - 'A' + b[j] + tmp;
tmp = 0;
if(a[i] > 'Z'){
a[i] -= ('Z' - 'A' + 1);
tmp = 1;
}
--i, --j;
}
else{
a[i] = a[i] + tmp;
tmp = 0;
if(a[i] > 'Z'){
a[i] -= ('Z'-'A'+1);
tmp = 1;
}
--i;

}
}
if(tmp){
for(i = len1; i >= 0; --i)
a[i+1] = a[i];
a[0] = 'B';
}

}

void outPut(char *a)
{
int len = strlen(a);
bool flag = false;
for(int i = 0; i < len; ++i){
if(a[i] != 'A') flag = true;
if(flag) printf("%c", a[i]);
}
if(!flag) puts("A");
else puts("");
}

int main()
{
char arr1[210], arr2[210];
int len1, len2;
while(scanf("%s %s", arr1, arr2) != EOF)
{
len1 = strlen(arr1);
len2 = strlen(arr2);
if(len1 > len2){
add(arr1, arr2);
outPut(arr1);
}
else{
add(arr2, arr1);
outPut(arr2);
}
}
return 0;
}


高精度到此完一段落了..其实还有几题没做..到时候再说吧~Hdu 1250 1297 1905
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: