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)的更多相关文章

  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. android -- 蓝牙 bluetooth (二) 打开蓝牙

    4.2的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点不同而已,后续的流程是一样的.先来看systemServe ...

  2. git 使用过程(二、创建版本库)

    1.显示当前git所在操作文件路径 命令:pwd  2.改变当前操作路径 命令:cd /e/神马神马的,如果想到当前文件夹的某个子目录下,可以直接输入命令:cd 子目录名称,这样就可以了. 3.创建一 ...

  3. 【Hibernate】Remember that ordinal parameters are 1-based!

    此错误的官方解释:1.当hql中不需要参数,而传递了参数导致,2.set参数时没有从0开始. 但此问题不属这两种. 检查导入的libraries无错误. 最后在网络搜索到:http://qihaihu ...

  4. [Swust OJ 781]--牛喝水

    Time limit(ms): 1000 Memory limit(kb): 65535   The cows have a line of 20 water bowls from which the ...

  5. POJ 2451 Uyuw's Concert(半平面交nlgn)

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> # ...

  6. HDU1316(求区间斐波那契数的个数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1316 题意:给两个数a和b,其中它们可能很大,最大到10^100,然后求去区间[a,b]内有多少个fib数 ...

  7. ORACLE列值合併

    合併列值最通用的方法就是寫一個自定義函數去實現,這裏介紹的是其它方法. 在SQL Server中合併列值能够使用For Xml Path,在Oracle中則能够使用wm_concat 或 ListAg ...

  8. 嵌入式MCU开发群资源

     STM32CubeMX是一款图形化软件设置工具,允许使用图形化向导来生成C初始化代码.它是未来开发stm32系列产品的主流软件,是ST公司的主动原创,可以减轻开发工作,时间和费用.STM32Cube ...

  9. Vi/VIM键盘图, Vi/vim学习图

    Vi/vim学习图 引用: Vi键盘图片可视化教程 http://www.cnblogs.com/me115/archive/2010/11/16/1878295.html 网上的文章易流失.感谢分享 ...

  10. BZOJ 3036: 绿豆蛙的归宿( 期望dp )

    从终点往起点倒推 . 在一个图 考虑点 u , 出度为 s : s = 0 , d[ u ] = 0 ; s ≠ 0 , 则 d( u ) = ( ∑ d( v ) ) / s ( ( u , v ) ...