藍橋杯:矩陣翻硬幣


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM