2019 ICPC 银川区域赛 - I Base62(大数+进制转换)
题目链接
题目大意
给你一个 x x x进制和一个 y y y进制 ( 2 ≤ x , y ≤ 62 ) (2 \leq x,y \leq 62) (2≤x,y≤62)和一个 x x x进制下的大数 z z z(最大可能是 6 2 1 20 62^120 62120)然后把 z z z转化为 y y y进制下数并输出。其中 ′ A ′ − ′ Z ′ 'A'-'Z' ′A′−′Z′分别表示 10 − 35 10-35 10−35, ′ a ′ − ′ z ′ 'a'-'z' ′a′−′z′分别表示 36 − 61 36-61 36−61。
解题思路
使用 J a v a Java Java直接写即可。题目让我误以为 A − z A-z A−z的 A S C I I ASCII ASCII码是连续的,结果找了半天,才知道中间还隔着六个其他字符。除了这个卡了还有就是当 z z z是 0 0 0的时候很明显就是 0 0 0。
Java大数的可以参考我的博客
import java.math.BigInteger;
import java.util.Scanner;
import java.lang.StringBuffer;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n,m;
String string;
Scanner scanner = new Scanner(System.in);
n=scanner.nextInt();
m=scanner.nextInt();
string=scanner.next();
if(string.equals("0")) { //贼坑的特判
System.out.println(0);
return;
}
BigInteger bigInteger=BigInteger.ZERO,flag=BigInteger.ONE,K=BigInteger.valueOf(n);
for(int i=string.length()-1;i>=0;i--) { //转化为十进制的大数
int t;
if(string.charAt(i)>='0' && string.charAt(i)<='9') {
t=string.charAt(i)-'0';
}else if(string.charAt(i)>='A' && string.charAt(i)<='Z')
t=string.charAt(i)-'A'+10;
else t=string.charAt(i)-'A'+4; //因为中间隔了六个其他字符,所以这里+10-6相当于+4
//System.out.println(t);
BigInteger num=BigInteger.valueOf(t);
num=num.multiply(flag);
bigInteger=bigInteger.add(num);
flag=flag.multiply(K);
}
//System.out.println(bigInteger);
String ans="";
BigInteger v=BigInteger.valueOf(m);
while(bigInteger.compareTo(BigInteger.ZERO)!=0) {
BigInteger modInteger=bigInteger.mod(v);
int res=Integer.valueOf(String.valueOf(modInteger));
//System.out.println(res);
if(res>=10) {
res-=10;
if(res<26)
ans+=(char)('A'+res); //注意如果不加强转的话,进入字符串的会是ASCII码而不是字符
else
ans+=(char)('A'+res+6); //同上
}else{
ans+=res;
}
bigInteger=bigInteger.divide(v);
}
//String类没有反转操作,需要借助于StringBuffer或者StringBuilder
StringBuffer sBuffer=new StringBuffer(ans);
ans=sBuffer.reverse().toString();
System.out.println(ans);
}
}