• csu 1114平方根大搜索(JAVA大小数+二分)


    1114: 平方根大搜索

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 182  Solved: 96
    [Submit][Status][Web Board]

    Description

    在二进制中,2的算术平方根,即sqrt(2),是一个无限小数1.0110101000001001111...
    给定一个整数n和一个01串S,你的任务是在sqrt(n)的小数部分(即小数点之后的部分)中找到S第一次出现的位置。如果sqrt(n)是整数,小数部分看作是无限多个0组成的序列。

    Input

    输入第一行为数据组数T (T<=20)。以下每行为一组数据,仅包含一个整数n (2<=n<=1,000,000)和一个长度不超过20的非空01串S。

    Output

    对于每组数据,输出S的第一次出现中,第一个字符的位置。小数点后的第一个数字的位置为0。输入保证答案不超过100。

    Sample Input

    2
    2 101
    1202 110011
    

    Sample Output

    2
    58
    

    HINT

    Source

    利用JAVA的大小数进行二分求解开方之后的数,设置标度为200,然后化成二进制进行匹配。

    import java.math.BigDecimal;
    import java.util.Scanner;
    
    
    public class Main {
        final static BigDecimal eps = BigDecimal.valueOf(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
             int tcase = sc.nextInt();
             while(tcase-- > 0){
                 String str = sc.next();
                 String str1 = sc.next();
                 BigDecimal a = new BigDecimal(str);
                 a.setScale(200);
                 BigDecimal l = BigDecimal.ZERO;
                 l.setScale(200);
                 BigDecimal r = a;
                 r.setScale(200);
                 BigDecimal mid = new BigDecimal("0");
                 mid.setScale(200);
                 while(l.add(eps).compareTo(r)<=0){
                     mid = l.add(r).divide(BigDecimal.valueOf(2));
                     if(mid.multiply(mid).compareTo(a)>0){
                         r = mid;
                     }else{
                         l = mid;
                     }
                 }
                 String s = mid.toString();
                 int idx = 0;
                 for(int i=0;i<s.length();i++){
                     if(s.charAt(i)=='.'){
                         idx = i;
                         break;
                     }
                 }
                 s = s.substring(idx+1, s.length());
                 s = "0."+s;
                 mid = new BigDecimal(s);
                 String ans = "";
                 for(int i=1;i<=200;i++){
                     mid = mid.multiply(BigDecimal.valueOf(2));
                     if(mid.compareTo(BigDecimal.ONE)>=0){
                         ans+=1;
                         mid = mid.subtract(BigDecimal.ONE);
                     }else{
                         ans+=0;
                     }
                 }
                 int res = ans.indexOf(str1);
                 System.out.println(res);
             }
        }
         
    }
  • 相关阅读:
    判断ImageIcon创建成功
    Node中的explorer views的双击事件
    Oracle数据类型
    Sql三种行转列
    数据库迁移
    并发采集同一站点被封的解决方案
    .net获取版本号的三种方法
    List转DataSet
    Orcale自增长主键
    python学习笔记数字和表达式
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5762525.html
Copyright © 2020-2023  润新知