題目地址: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 }
?