1. 程式人生 > >大數問題之26進位制轉化

大數問題之26進位制轉化

杭電2100Lovekey

Problem Description
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

Input
題目有多組測試資料。
每組測試資料包含兩個值均為的XYZ-26進位制數,每個數字的每位只包含大寫字母,並且每個數字不超過200位。
Output
輸出XYZ的lovekey,每組輸出佔一行。
Sample Input
AAAADH  BCE
DRW  UHD
D  AAAAA
Sample Output
BFL
XYZ
D

1;有人把這題歸為大數問題。可能是200位吧,然後就是26進位制吧。但是這題並不能算做大數問題吧。因為我感覺我那ac程式碼根本就是一個找規律,字串型別的題目,不多說了,先說一下我的思路吧。


2;首先先看一下是26進位制,還要注意一下從A到Z;表示0到25.。A表示0;而A的ASC碼錶示的是65,所以就是字母減去65表示的就是我們理解的26進位制的數字了。然後就是要研究一下它那個事列,解說事例1的步驟。就是在這裡面找出規律的。

3;規律;
AAAADH BCE
543210210
然後把在0位的各自減去65後相加然後加是上65是不是對應著輸出結果的0位L。然而其他位也是,有人會不會問如果兩個數相加的結果大於了25那樣怎麼做呢?恩,就跟我們普通進位制的加法一樣,達到數之後就是要進位的。看一下進位程式碼吧;
if(s[k] > 25){
l = 1;
s[k] = s[k]%26;
}elsel = 0;

這樣就可以完成進位了,

4說完了,可以擺程式碼了。哦。還要注意一下輸出情況,如果剛開始全是A則不輸出的因為A在26進制中表示的是0;前導0肯定不輸出啊,因此要設定判斷一下,詳情看程式碼吧;


#include<stdio.h>
#include<string.h>
int main()
{
int m, l, k, i, j, lena, lenb, flag, s[210];
char a[210], b[210], t[210];
while(scanf("%s",a) != EOF){
scanf("%s",b);
lena = strlen(a);
lenb = strlen(b);
if(lena < lenb){
m = lenb;
lenb = lena;
lena = m;
strcpy(t,b);
strcpy(b,a);
strcpy(a,t);
}
k = 0;
l = 0;
for(i = lena-1,j = lenb-1; j != -1; i--,j--){
s[k] = (a[i]-65)+(b[j]-65)+l;
if(s[k] > 25){
l = 1;
s[k] = s[k]%26;
}
elsel = 0;
k++;
}
for( ; i != -1; i--){
s[k] = (a[i]-65)+l;
if(s[k] > 25){
l = 1;
s[k] = s[k]%26;
}
elsel = 0;
k++;
}
if(l != 0){
s[k] = l;
k++;
}
flag = 1;
for(i = k-1; i != -1; i--){
if(flag == 1 && s[i] == 0){
continue;
}
printf("%c",s[i]+65);
flag = 0;
}
printf("\n");
}

return 0 ;
}