Lovekey
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4734 Accepted Submission(s): 1529
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
每組測試數據包含兩個值均爲的XYZ-26進制數,每個數字的每位只包含大寫字母,並且每個數字不超過200位。
我的測試數據
輸入
ZZZ B
AA A
輸出
BAAA
A
AC代碼
#include<iostream>
using namespace std;
int main()
{
char str1[210],str2[210];
int i,j,n,m,k;
int a[210],b[210],c[210];
while(scanf("%s %s",str1,str2)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=strlen(str1);
m=strlen(str2);
for(j=0,i=n-1;i>=0;i--,j++)
a[j]=str1[i]-'A';
a[j]='\0';
for(j=0,i=m-1;i>=0;i--,j++)
b[j]=str2[i]-'A';
b[j]='\0';//倒着存兩組數據
if(n>m)
k=n;
else
k=m;
for(i=0;i<k;i++)
c[i]=a[i]+b[i];
for(i=0;i<k;i++)
if(c[i]>25)
{
c[i]-=26;
c[i+1]+=1;
} //選取大的範圍循環相加
for(i=k;i>=0;i--)
if(c[i]!=0)
break;//過濾A的情況
if(i==-1)
printf("%c",'A');//全部是A時要輸出一個A
for(;i>=0;i--)
printf("%c",c[i]+'A');
printf("\n");
}
return 0;
}
本題主要是26進制的大數計算,算的上比較簡單的數論水題!
謝謝閱讀!