您的位置:首页 > 理论基础

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

2016-08-11 22:12 477 查看


平方根大搜索

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

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: