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
  1. import java.util.*;
  2. import java.math.*;
  3. public class Main{
  4. static String tob(BigDecimal d) //求小数d的二进制表示,返回二进制存储串s
  5. {
  6. String s=new String();
  7. int n=150;
  8. while(!d.equals(BigDecimal.ZERO)&&n--!=0)
  9. {
  10. d=d.multiply(BigDecimal.valueOf(2));
  11. BigInteger x=d.toBigInteger();
  12. s+=x;
  13. d=d.subtract(BigDecimal.valueOf(x.longValue()));
  14. }
  15. return s;
  16. }
  17. public static BigDecimal culsqrt(int num) //以下三个函数(方法)用来求num的平方根
  18. {
  19.  
  20. return sqrtMathod(num);
  21.  
  22. }
  23.  
  24. public static BigDecimal sqrtMathod(int num)
  25. {
  26. BigDecimal sqrtNum = BigDecimal.valueOf(-1);
  27. boolean isFindSqrt = false;
  28.  
  29. // get int sqrt num
  30. double tempSqrt = 0;
  31. if (num > 0)
  32. {
  33. if (num == 1)
  34. {
  35. return BigDecimal.valueOf(1);
  36. }
  37. else
  38. {
  39. for (int j = 0; j <= num / 2 + 1; j++)
  40. {
  41. if (j * j == num)
  42. {
  43. sqrtNum = BigDecimal.valueOf(j);
  44. isFindSqrt = true;
  45. break;
  46. }
  47. if (j * j > num)
  48. {
  49. tempSqrt = j - 1;
  50. break;
  51. }
  52. }
  53. }
  54. }
  55.  
  56. if (!isFindSqrt)
  57. {
  58. sqrtNum = recuFindSqrt(num, BigDecimal.valueOf(tempSqrt), isFindSqrt, BigDecimal.valueOf(1));
  59. }
  60.  
  61. return sqrtNum;
  62. }
  63.  
  64. private static BigDecimal recuFindSqrt(int num, BigDecimal sqrtValue, boolean isFindSqrt, BigDecimal ac)
  65. {
  66. ac = ac.multiply(BigDecimal.valueOf(10));
  67. BigDecimal tempSqrt = BigDecimal.valueOf(0);
  68. for (int i = 0; i < 10; i++)
  69. {
  70. tempSqrt = sqrtValue .add(BigDecimal.valueOf(i).divide(ac) );
  71. if (tempSqrt .multiply(tempSqrt) .equals(BigDecimal.valueOf(num)))
  72. {
  73. isFindSqrt = true;
  74. sqrtValue = tempSqrt;
  75. }
  76. else if (tempSqrt .multiply(tempSqrt) .compareTo(BigDecimal.valueOf(num))==1)
  77. {
  78. tempSqrt = sqrtValue.add(BigDecimal.valueOf(i - 1) .divide( ac));
  79. sqrtValue = tempSqrt;
  80. break;
  81. }
  82. }
  83.  
  84. BigDecimal temp = tempSqrt;
  85. if (temp.toString().length() <= 150 && !isFindSqrt)
  86. {
  87. sqrtValue = recuFindSqrt(num, tempSqrt, isFindSqrt, ac);
  88. }
  89.  
  90. return sqrtValue;
  91. }
  92.  
  93. public static double add(double v1, double v2)
  94. {
  95. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  96. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  97. return b1.add(b2).doubleValue();
  98. }
  99.  
  100. public static void main(String[] args) {
  101. Scanner in= new Scanner(System.in);
  102. int t;
  103. int n;
  104. String st;
  105. t=in.nextInt();
  106. while(t--!=0)
  107. {
  108. n=in.nextInt();
  109. st=in.next();
  110. BigDecimal d=culsqrt(n); //求平方根
  111. BigInteger x=d.toBigInteger();
  112. d=d.subtract(BigDecimal.valueOf(x.longValue())); //分离出小数部分
  113. String tobs=tob(d); //将小数转化为二进制,存储在串tobs中
  114. System.out.println(tobs.indexOf(st)); //输出查找结果
  115. }
  116. }
  117. }

湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)的更多相关文章

  1. 湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504 - Updating a Dictionary)

    UVA12504 - Updating a Dictionary 给出两个字符串,以相同的格式表示原字典和更新后的字典.要求找出新字典和旧字典的不同,以规定的格式输出. 算法操作: (1)处理旧字典, ...

  2. 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)

    Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...

  3. 第八届河南省程序设计大赛-B.最大岛屿0000110011000000

    最大岛屿                                                                                           时间限制: ...

  4. 第十一届GPCT杯大学生程序设计大赛完美闭幕

    刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...

  5. NYOJ--1236--挑战密室(第八届河南省程序设计大赛)

    挑战密室 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密 ...

  6. nyoj 1239 引水project (河南省第八届acm程序设计大赛)

    题目1239 pid=1239" style="color:rgb(55,119,188)">题目信息 pid=1239" style="col ...

  7. nyoj1237 最大岛屿(河南省第八届acm程序设计大赛)

    题目1237 pid=1237" style="color:rgb(55,119,188)">题目信息 执行结果 本题排行 讨论区 最大岛屿 时间限制:1000 m ...

  8. 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏

    第13届 广东工业大学ACM程序设计大赛 C题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. ​ 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...

  9. nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)

    题目1238 题目信息 执行结果 本题排行 pid=1238" style="text-decoration:none; color:rgb(55,119,188)"&g ...

随机推荐

  1. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值

    因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...

  2. ios多视图开发中:xib与UIViewController的关联

    个人感觉ios中的UIViewController和xib文件,分别相当于android的Activity 和Layout文件 当时两者的关联比android稍微复杂些. ios上分别新建的UIVie ...

  3. Android:OptionMenu

    MainActivity: package com.example.optionmenu; import android.content.Intent; import android.os.Bundl ...

  4. Codeforces 490B Queue【模拟】

    题意还是很好理解的,根据题目给出描述条件然后求出这串QUEUE 我的做法就是用两个数组 before[] 和 after[] 表示 ai 前面的前面的人的学号 和 ai 后面的后面的人的学号 ex[] ...

  5. 单实例支撑每天上亿个请求的SSDB

    SSDB 是一个 C++ 开发的 NoSQL 存储服务器, 支持 zset, map 数据结构, 可替代 Redis, 特别适合存储集合数据. SSDB 被开发和开源出来后, 已经在生产环境经受了3个 ...

  6. xen虚拟机安装实践

    xen虚拟机环境安装,用了2天的时间摸索,终于出来了,给大家分享一下. 1.安装宿主环境,我使用的是Centos6.3 2.安装xend,参考了一篇老外的文章,基本比较顺利. 地址:http://xe ...

  7. 【四】注入框架RoboGuice使用:(Your First System Service Injection)

    上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为 ...

  8. DataSource绑定DataTable.Select()显示system.data.DataRow问题解决的方法

    有时候我们须要在控件中绑定DataTable中设定条件过滤后的数据,此时,在winForm环境中,一些控件不能正确绑定并显示数据内容.这是由于DataTable.Select()返回的是DataRow ...

  9. LDAP研究

    一.ldap介绍 ldap是轻量级的文件夹訪问协议.重点是文件夹訪问协议.更为重点的是协议.好吧他是一个协议.也就是一个标准. 那么实现这款协议的软件当中有一款就是openldap. 二.安装wind ...

  10. Qt学习之路(54): 自定义拖放数据对象

    前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对 ...