这可真是一道神题~~
网上都讲的很明白了,我看网上没人用Java写,我写了个Java版的.
注意的坑就是二分的上下界.
import java.math.BigInteger;
import java.util.*;
public class Main {
static BigInteger convert(BigInteger radix,String num) {
BigInteger out=BigInteger.ZERO;
int exp=0;
for(int i=num.length()-1;i>=0;i--) {
char c=num.charAt(i);
if(c>='a'&&c<='z') {
int nu=c-'a'+10;
out=out.add(new BigInteger(String.valueOf(nu)).multiply(radix.pow(exp)));
}
else {
int nu=c-'0';
out=out.add(new BigInteger(String.valueOf(nu)).multiply(radix.pow(exp)));
}
exp++;
}
return out;
}
public static void main(String[] args) {
//System.out.println(convert(new BigInteger("10"), "6"));
Scanner in=new Scanner(System.in);
String a=in.next(),b=in.next();
int tag=in.nextInt();
BigInteger radix=in.nextBigInteger();
if(tag==2) {
String tmp=a;
a=b;
b=tmp;
}
//System.out.println(radix);
BigInteger num1=convert(radix,a);
//System.out.println(num1);
int minrad=2;
for(int i=0;i<b.length();i++) {
char c=b.charAt(i);
if(c>='a'&&c<='z') {
int nu=c-'a'+10;
minrad=Math.max(minrad,nu+1);
}
else {
int nu=c-'0';
minrad=Math.max(minrad,nu+1);
}
}
BigInteger l=new BigInteger(String.valueOf(minrad)),r=convert(radix, a),two=new BigInteger("2");
if(r.compareTo(two)<0) {
r=two;
}
//System.out.println(r);
int flag=0;
while(l.compareTo(r)<=0) {
BigInteger mid=l.add(r).divide(two);
int rst=num1.compareTo(convert(mid, b));
if(rst<=0) {
r=mid.subtract(BigInteger.ONE);
}
else {
l=mid.add(BigInteger.ONE);
}
}
if(convert(l, b).compareTo(num1)==0) {
System.out.println(l);
}
else{
System.out.println("Impossible");
}
}
}
真的不要小看25分的题.
舒服的一匹~