蓝桥杯第五届真题:矩阵翻硬币

点击查看:蓝桥杯历年真题 题解目录
矩阵翻硬币

在这里插入图片描述

package java_2014_B;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
   //第x行第y列被翻动的总次数?
   //考虑第1行,第y列,y有多少真因子,就会被翻动多少次,而所有的y中,只有平方数的真因子个数为奇数(约数总是成对出现的)
   //考虑第1列,第x行,x有多少真因子,就会被翻动多少次,而所有的x中,只有平方数的真因子个数为奇数
   //x,y硬币被翻动的次数=x真因子个数*y真因子个数,只有奇数*奇数=奇数,所以,若要x,y为反面,必须x,y都是平方数
   //因此,反面硬币总数=m中的平方数的个数*n中平方数的个数
   //那么在m中有多少个平方数呢?答案是sqrt(m)向下取整个,如9内有三个平方数1,4,9;16里面有4个平方数1,4,9,16;25内有5个平方数
   //因此此题等价于求sqrt(m)*sqrt(n),那么怎么对一个很大的数开平方呢?
   //假设一个数的长度为length,其平方根的长度为length/2(偶数)或者length/2+1(奇数)
   //我们可以从高位不停地试探,每一个取平方后恰好不超过目标平方数的值
public class Main010_矩阵翻硬币 {
  public static void main(String[] args) {
   Scanner in = new Scanner(System.in);
   String s1 = in.next();
   String s2 = in.next();
   System.out.println(sqrt(s1).multiply(sqrt(s2)));
  }
  private static BigInteger sqrt(String s) {
    int length = s.length();
    int len = 0;
    if (length % 2 == 0)
      len = length / 2;
    else
      len = length / 2 + 1;
    char[] sArr = new char[len];
    Arrays.fill(sArr, '0');
    BigInteger target = new BigInteger(s);
    for (int pos = 0; pos < len; pos++) {
      for (char c = '1'; c <= '9'; c++) {
        sArr[pos] = c;//在pos这个位置上试着填入1-9
        BigInteger pow = new BigInteger(String.valueOf(sArr)).pow(2);//平方
        if (pow.compareTo(target) == 1)//试探数的平方更大
        {
          sArr[pos] -= 1;
          break;
        }
      }
    }
    return new BigInteger(String.valueOf(sArr));
  }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值