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 }
  • 相关阅读:
    前Citrix技术总监:虚拟化将解决云计算安全问题 狼人:
    悲剧:金山毒霸官网被黑客攻破 狼人:
    接口程序设计Windows CE嵌入式系统程序开发
    参数返回Oracle 常用函数:nvl/nullif/case when/wm_concat/replace
    数据恢复[Oracle] Flashback闪回机制
    重复字段Oracle删除重复行
    进程函数一步步理解Linux之信号
    读取数据事务
    菜单函数Android学习整理菜单Menu
    参数实现Oracle SQL中实现indexOf和lastIndexOf功能
  • 原文地址:https://www.cnblogs.com/mycd/p/5414127.html
Copyright © 2011-2022 走看看