藍橋杯第五屆真題:矩陣翻硬幣

點擊查看:藍橋杯歷年真題 題解目錄

矩陣翻硬幣

在這裏插入圖片描述

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));
  }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章