蓝桥杯:矩阵翻硬币

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

 

转载于:https://www.cnblogs.com/mycd/p/5414127.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值