湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30746#problem/D
D - 平方根大搜索
UVA12505 - Searching in sqrt(n)
解题思路:求出n的平方根,去整数,化二进制,字符串子串查找。
基本思路简单,但是求平方根那里,不能直接用库函数方法,因为Math.sqrt()返回值的精度比较小。我们这里要用到的精度最高是140位。所以,求平方根的函数(中心代码转自http://blog.csdn.net/nujiah001/article/details/6657422)要自己写。不单只是自己写,由于设计的精度过高,一般的数据类型(如double)无法存储。所以必须用到JAVA中的大数类import java.math.BigDecimal;。
1545839 | 20114045007 | D | Accepted | 125440 KB | 5044 ms | Java | 2593 B | 2013-09-09 14:35:32 |
- import java.util.*;
- import java.math.*;
- public class Main{
- static String tob(BigDecimal d) //求小数d的二进制表示,返回二进制存储串s
- {
- String s=new String();
- int n=150;
- while(!d.equals(BigDecimal.ZERO)&&n--!=0)
- {
- d=d.multiply(BigDecimal.valueOf(2));
- BigInteger x=d.toBigInteger();
- s+=x;
- d=d.subtract(BigDecimal.valueOf(x.longValue()));
- }
- return s;
- }
- public static BigDecimal culsqrt(int num) //以下三个函数(方法)用来求num的平方根
- {
- return sqrtMathod(num);
- }
- public static BigDecimal sqrtMathod(int num)
- {
- BigDecimal sqrtNum = BigDecimal.valueOf(-1);
- boolean isFindSqrt = false;
- // get int sqrt num
- double tempSqrt = 0;
- if (num > 0)
- {
- if (num == 1)
- {
- return BigDecimal.valueOf(1);
- }
- else
- {
- for (int j = 0; j <= num / 2 + 1; j++)
- {
- if (j * j == num)
- {
- sqrtNum = BigDecimal.valueOf(j);
- isFindSqrt = true;
- break;
- }
- if (j * j > num)
- {
- tempSqrt = j - 1;
- break;
- }
- }
- }
- }
- if (!isFindSqrt)
- {
- sqrtNum = recuFindSqrt(num, BigDecimal.valueOf(tempSqrt), isFindSqrt, BigDecimal.valueOf(1));
- }
- return sqrtNum;
- }
- private static BigDecimal recuFindSqrt(int num, BigDecimal sqrtValue, boolean isFindSqrt, BigDecimal ac)
- {
- ac = ac.multiply(BigDecimal.valueOf(10));
- BigDecimal tempSqrt = BigDecimal.valueOf(0);
- for (int i = 0; i < 10; i++)
- {
- tempSqrt = sqrtValue .add(BigDecimal.valueOf(i).divide(ac) );
- if (tempSqrt .multiply(tempSqrt) .equals(BigDecimal.valueOf(num)))
- {
- isFindSqrt = true;
- sqrtValue = tempSqrt;
- }
- else if (tempSqrt .multiply(tempSqrt) .compareTo(BigDecimal.valueOf(num))==1)
- {
- tempSqrt = sqrtValue.add(BigDecimal.valueOf(i - 1) .divide( ac));
- sqrtValue = tempSqrt;
- break;
- }
- }
- BigDecimal temp = tempSqrt;
- if (temp.toString().length() <= 150 && !isFindSqrt)
- {
- sqrtValue = recuFindSqrt(num, tempSqrt, isFindSqrt, ac);
- }
- return sqrtValue;
- }
- public static double add(double v1, double v2)
- {
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return b1.add(b2).doubleValue();
- }
- public static void main(String[] args) {
- Scanner in= new Scanner(System.in);
- int t;
- int n;
- String st;
- t=in.nextInt();
- while(t--!=0)
- {
- n=in.nextInt();
- st=in.next();
- BigDecimal d=culsqrt(n); //求平方根
- BigInteger x=d.toBigInteger();
- d=d.subtract(BigDecimal.valueOf(x.longValue())); //分离出小数部分
- String tobs=tob(d); //将小数转化为二进制,存储在串tobs中
- System.out.println(tobs.indexOf(st)); //输出查找结果
- }
- }
- }
湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)的更多相关文章
- 湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504 - Updating a Dictionary)
UVA12504 - Updating a Dictionary 给出两个字符串,以相同的格式表示原字典和更新后的字典.要求找出新字典和旧字典的不同,以规定的格式输出. 算法操作: (1)处理旧字典, ...
- 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...
- 第八届河南省程序设计大赛-B.最大岛屿0000110011000000
最大岛屿 时间限制: ...
- 第十一届GPCT杯大学生程序设计大赛完美闭幕
刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...
- NYOJ--1236--挑战密室(第八届河南省程序设计大赛)
挑战密室 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密 ...
- nyoj 1239 引水project (河南省第八届acm程序设计大赛)
题目1239 pid=1239" style="color:rgb(55,119,188)">题目信息 pid=1239" style="col ...
- nyoj1237 最大岛屿(河南省第八届acm程序设计大赛)
题目1237 pid=1237" style="color:rgb(55,119,188)">题目信息 执行结果 本题排行 讨论区 最大岛屿 时间限制:1000 m ...
- 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏
第13届 广东工业大学ACM程序设计大赛 C题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...
- nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)
题目1238 题目信息 执行结果 本题排行 pid=1238" style="text-decoration:none; color:rgb(55,119,188)"&g ...
随机推荐
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...
- ios多视图开发中:xib与UIViewController的关联
个人感觉ios中的UIViewController和xib文件,分别相当于android的Activity 和Layout文件 当时两者的关联比android稍微复杂些. ios上分别新建的UIVie ...
- Android:OptionMenu
MainActivity: package com.example.optionmenu; import android.content.Intent; import android.os.Bundl ...
- Codeforces 490B Queue【模拟】
题意还是很好理解的,根据题目给出描述条件然后求出这串QUEUE 我的做法就是用两个数组 before[] 和 after[] 表示 ai 前面的前面的人的学号 和 ai 后面的后面的人的学号 ex[] ...
- 单实例支撑每天上亿个请求的SSDB
SSDB 是一个 C++ 开发的 NoSQL 存储服务器, 支持 zset, map 数据结构, 可替代 Redis, 特别适合存储集合数据. SSDB 被开发和开源出来后, 已经在生产环境经受了3个 ...
- xen虚拟机安装实践
xen虚拟机环境安装,用了2天的时间摸索,终于出来了,给大家分享一下. 1.安装宿主环境,我使用的是Centos6.3 2.安装xend,参考了一篇老外的文章,基本比较顺利. 地址:http://xe ...
- 【四】注入框架RoboGuice使用:(Your First System Service Injection)
上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为 ...
- DataSource绑定DataTable.Select()显示system.data.DataRow问题解决的方法
有时候我们须要在控件中绑定DataTable中设定条件过滤后的数据,此时,在winForm环境中,一些控件不能正确绑定并显示数据内容.这是由于DataTable.Select()返回的是DataRow ...
- LDAP研究
一.ldap介绍 ldap是轻量级的文件夹訪问协议.重点是文件夹訪问协议.更为重点的是协议.好吧他是一个协议.也就是一个标准. 那么实现这款协议的软件当中有一款就是openldap. 二.安装wind ...
- Qt学习之路(54): 自定义拖放数据对象
前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对 ...