zoukankan      html  css  js  c++  java
  • 蓝桥杯:矩阵翻硬币

    题目地址: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 }
  • 相关阅读:
    转 configure: error: Cannot find ldap.h
    DDoS(Distributed Denial of Service,分布式拒绝服务)
    j2ee 1.5和1.6的区别
    机器学习
    免安装版Tomcat6.0启动方法
    mysql补充(2)常用sql语句
    mysql补充(4)数据完整性
    mysql补充(3)优化sql语句查询常用的30种方法
    mysql补充(1)校对集utf8_unicode_ci与utf8_general_ci
    jdbc(1)(一)
  • 原文地址:https://www.cnblogs.com/mycd/p/5414127.html
Copyright © 2011-2022 走看看