(湖南省第八届大学生计算机程序设计竞赛)平方根大搜索 (Java大小数+二分开平方)

平方根大搜索

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

湖南省第八届大学生计算机程序设计竞赛




可以手工模拟开方,也可以二分法开平方。

import java.io.BufferedInputStream;
import java.math.BigDecimal;
import java.util.Scanner;  
  
public class Main {  
	public static BigDecimal two = new BigDecimal("2");
	public static BigDecimal one = new BigDecimal("1");
	public static String zher(BigDecimal a){
		String s = "";
	
		BigDecimal te = a;
		for (int i=0;i<150;i++){
			 te = te.multiply(two);
			if (te.compareTo(one)>=0){
				s = s+"1";
				te=te.subtract(one);
			}else s = s+"0";
		}
		return s;
	}
	public static BigDecimal ping(BigDecimal a){
		
		BigDecimal l = BigDecimal.ZERO,r = a,mid=a;
		BigDecimal eps =new BigDecimal(1e-120);
		while (l.compareTo(r.subtract(eps))==-1){
			mid = l.add(r).divide(two);
			if (mid.multiply(mid).compareTo(a)==1){
				r = mid;
			}else l = mid;
		}
		return mid;
	}
	
    public static void main(String [] args){  
       Scanner cin = new Scanner(new BufferedInputStream(System.in));
       int n = cin.nextInt();
       while (n-->0){
    	   BigDecimal a = cin.nextBigDecimal();
    //	   System.out.println(ping(a));
    	   String s = cin.next();
    	   BigDecimal b =  ping(a);
    	   BigDecimal c = b.setScale(0,BigDecimal.ROUND_DOWN);
    	   b = b.subtract(c);
    	   String t = zher(b);
           int x = t.indexOf(s);
           System.out.println(x);
       }
       
    }  
}  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值