题目地址:http://lx.lanqiao.org/problem.page?gpid=T126
这道题强烈建议用java做,毕竟自带BigInteger类。
此题看似是一道模拟题,但由于数据规模很大(10的1000次方),只能找规律。规律是最终结果为sqrt(n)*sqrt(m),然后此题就成了大数开根的题。
做法是先对数字的长度进行判断,如果被开根的数是偶数位的(例如4365,4位),开根后就为其原位数的一半(66,2位)。如果其位数是奇数位的(例如121,3位),开根后其位数就是原位数的二分之一向下区整再加一(11,3/2+1=2位)。
确定了位数之后就对其进行由高位至低位,由小到大的遍历。
以4356为例,先确定答案是两位的,初始化为00,从十位开始1-9的遍历,到70的时候该数的平方为4900>4356,从而确定十位是7-1=6。个位同理。
本程序有多次char[], String, BigIntger之间的转化,要正确转化。
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 public class Main { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 Scanner cin = new Scanner(System.in); 10 String s1 = cin.next(); 11 String s2 = cin.next(); 12 BigInteger ans1 = BigSqrt(s1); 13 BigInteger ans2 = BigSqrt(s2); 14 //System.out.println(ans1+" "+ans2); 15 BigInteger ans = ans1.multiply(ans2); 16 System.out.println(ans); 17 } 18 19 private static BigInteger BigSqrt(String s) { 20 int mlen = s.length(); //被开方数的长度 21 int len; //开方后的长度 22 BigInteger beSqrtNum = new BigInteger(s);//被开方数 23 BigInteger sqrtOfNum; //存储开方后的数 24 BigInteger sqrtOfNumMul; //开方数的平方 25 String sString;//存储sArray转化后的字符串 26 if(mlen%2 == 0) len = mlen/2; 27 else len = mlen/2+1; 28 char[] sArray = new char[len]; 29 Arrays.fill(sArray, '0');//开方数初始化为0 30 for(int pos=0; pos<len; pos++){ 31 //从最高开始遍历数组,每一位都转化为开方数平方后刚好不大于被开方数的程度 32 for(char num='1'; num<='9'; num++){ 33 sArray[pos] = num; 34 sString = String.valueOf(sArray); 35 sqrtOfNum = new BigInteger(sString); 36 sqrtOfNumMul = sqrtOfNum.multiply(sqrtOfNum); 37 if(sqrtOfNumMul.compareTo(beSqrtNum) == 1){ 38 sArray[pos]-=1; 39 break; 40 } 41 } 42 } 43 return new BigInteger(String.valueOf(sArray)); 44 } 45 }