HDOJ 2100 Lovekey

Stella981
• 阅读 456

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

注意必须是大数!!!!!!!
可以利用java中的大数来做:
java.math.BigDecimal和java.math.BigInteger
AC代码:

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

public class Main {
   
   
   
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        final char A[] =new char[26];
        for(int i=0;i<26;i++){
            A[i]=(char)(i+65);
        }
        final char B[] =new char[26];
//        System.out.println((int)('0'));
        for(int i=0;i<10;i++){
            B[i]=(char)(i+48);
        }
        for(int i=10;i<26;i++){
            B[i]=(char)(i+87);
        }

//        for(int i=0;i<26;i++){
   
   
   
//            System.out.println(A[i]);
//        }
//        for(int i=0;i<26;i++){
   
   
   
//            System.out.println(B[i]);
//        }

        while(sc.hasNext()){
            String a = sc.next();
            String b = sc.next();
//            System.out.println(a);
//            System.out.println(b);
            BigInteger sumNumber = new BigInteger("0");
            BigDecimal p1 = new BigDecimal(1);
            BigDecimal aBig = new BigDecimal(0);
            BigDecimal bBig = new BigDecimal(0);
            int k=0;
            //System.out.println(aNumber.toString(10));
            //System.out.println(bNumber.toString(10));

            for(int i=0;i<a.length();i++){
                for(int j=0;j<A.length;j++){
                    if(a.charAt(i)==A[j]){
                        k=j;
                        break;
                    }
                }
                BigDecimal p =p1;
                for(int h=0;h<a.length()-i-1;h++){
                    p = p.multiply(new BigDecimal(26));
                }
                p = p.multiply(new BigDecimal(k));
                //System.out.println("p="+p);


                aBig = aBig.add(p);

            }


            for(int i=0;i<b.length();i++){
                for(int j=0;j<A.length;j++){
                    if(b.charAt(i)==A[j]){
                        k=j;
                        break;
                    }
                }
                BigDecimal p =p1;
                for(int h=0;h<b.length()-i-1;h++){
                    p = p.multiply(new BigDecimal(26));
                }
                p = p.multiply(new BigDecimal(k));
                //System.out.println("p="+p);


                bBig = bBig.add(p);

            }
            //System.out.println(aBig);
            //System.out.println(bBig);

            aBig = aBig.add(bBig);

            String m= aBig.toPlainString();

            sumNumber = new BigInteger(m,10);


            String sumString = sumNumber.toString(26);

            //System.out.println(sumString);

            for(int i=0;i<sumString.length();i++){
                for(int j=0;j<B.length;j++){
                    if(sumString.charAt(i)==B[j]){
                        k=j;
                        break;
                    }
                }
                System.out.print(A[k]);

            }
            System.out.println();

        }

    }

}

本文同步分享在 博客“谙忆”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
Irene181 Irene181
2年前
一篇文章带你弄懂Python基础之进制和数据类型
大家好,我是Go进阶者,今天给大家分享一些Python基础(进制和数据类型),一起来看看吧一、进制1、什么是进制?进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tallymark计数)。对于任何一种进制X进制,就表示每一位置上的数运算时都是逢X进一位。十进制是逢十进
DaLongggggg DaLongggggg
3年前
python刷题-特殊的数字
问题描述  153是一个非常特殊的数,它等于它的每位数字的立方和,即153111555333。编程求所有满足这种条件的三位十进制数。输出格式  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。foriinrange(100,1000):astr(i)0bstr(i)1c
DaLongggggg DaLongggggg
3年前
python刷题-进制转换
十六进制转八进制问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n(1<n<10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。  【注意】  输入的十六进制数不会有
Peter20 Peter20
3年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
2年前
Java中BigDecimal的8种舍入模式
java.math.BigDecimal不可变的、任意精度的有符号十进制数。BigDecimal由任意精度的整数非标度值和32位的整数标度(scale)组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以10的负scale次幂。因此,BigDecimal表示的数值是(unsc
Wesley13 Wesley13
2年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
2年前
20180109Java位运算
一,Java位运算1.表示方法:  在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (1)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。 2.位运算符位运算表达式由
可莉 可莉
2年前
20180109Java位运算
一,Java位运算1.表示方法:  在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (1)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。 2.位运算符位运算表达式由
Wesley13 Wesley13
2年前
10进制转二进制字符串输出
importjava.util.Scanner;/Createdbylongforuson9:10PM5/9/2016.IDEATest.输入10进制输出二进制字符串先计算该数包含最大的2次方结果每减去一个该数该位二进制就记1
Stella981 Stella981
2年前
PAT A1015Reversible Primes(可逆素数)
主要考察了判断一个10进制数是否为素数(isZS(intss))和怎么求一个十进制数的n进制数rec(intn,intm)代码:1include<cstdio2include<algorithm3include<iostream4include<string5