(湖南省第八届大学生计算机程序设计竞赛)平方根大搜索 (Java大小数+二分开平方)
2016-08-11 22:12
477 查看
平方根大搜索
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);
}
}
}
相关文章推荐
- 计蒜客 数据结构 栈 数列翻转
- tinyhttpd源码详解
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之二叉树四:还原二叉树
- 数据结构实验之二叉树七:叶子问题
- 数据结构实验之二叉树一:树的同构
- 计蒜客 数据结构 栈 stack_expression C++
- 数据结构实验之二叉树三:统计叶子数
- 数据结构实验之二叉树的建立与遍历
- 划分树
- 数据结构实验之二叉树二:遍历二叉树
- http://www.cnblogs.com/yyyyy5101/archive/2011/03/11/1981078.html
- Android常见问题——找不到HttpClient和okHttp的包
- 数组中只出现一次的数字
- TCP拥塞避免
- Deep Learning:一、认识DL
- 【OVS2.5.0源码分析】normal action精确流表生成和刷新过程分析
- Go tcp通信
- 【网络】高级I/O多路复用之select、poll和epoll
- 如何往服务器中读写数据?