平方根大搜索
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 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);
}
}
}