【JAVA大数&&模拟】Lovekey HDU - 2100

题目链接

Lovekey HDU - 2100

题目

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

分析

将26进制数转化为10进制数,然后在10进制数下调用JAVA大数去直接运算。最后将运算结果转化为26进制数即可。
而XYZ-26进制数与10进制数之间的转化与常规的进制转化差不多,直接模拟即可。

相关的JAVA 知识:
在JAVA中访问String s的第i个元素,要用s.charAt(i)来访问。
比较大整数x是否等于0,要调用equals()函数,即while(!x.equals(BigInteger.valueOf(0))表示只要x不为0就进行循环。
将大整数a转为int型整数tmp,tmp=a.intValue().
在String类型ans后添加ASC码为a的字符,ans+=(char)(a).

AC代码

import java.math.BigInteger;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        String a,b;
        while(cin.hasNext()) {
            a=cin.next();
            b=cin.next();
            BigInteger x,y;
            x=strToint(a);
            y=strToint(b);
            x=x.add(y);
            a=intTostr(x);
            for(int i=a.length()-1;i>=0;i--)
                System.out.print(a.charAt(i));
            System.out.println();
        }
    }
    public static BigInteger pow(int a,int p) {
        BigInteger ans;
        ans=BigInteger.ONE;
        for(int i=1;i<=p;i++)
            ans=ans.multiply(BigInteger.valueOf(a));
        return ans;
    }
    public static BigInteger strToint(String s) {
        BigInteger ans,x,y;
        ans=BigInteger.ZERO;
        for(int i=0;i<s.length();i++) {
            x=BigInteger.valueOf(s.charAt(i)-'A');
            y=pow(26,s.length()-i-1);
            ans=ans.add(x.multiply(y));
        }
        return ans;
    }
    public static String intTostr(BigInteger x) {
        String ans="";
        while(!x.equals(BigInteger.valueOf(0))) {
            int tmp;
            tmp=x.mod(BigInteger.valueOf(26)).intValue();
            ans+=(char)(tmp+'A');
            x=x.divide(BigInteger.valueOf(26));
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37685156/article/details/80206942