51Nod-1166大数开平方(java版本)
题目
https://vjudge.net/problem/51Nod-1166
思路
用更快的牛顿迭代法。把问题转化为求x^2 -n=0的根,假设解为x0,当前解为x 且 x^2 - n>0,在(x,x^2 - n)处作切线,与x轴交点横坐标为新的x,然后迭代即可,比二分法快
牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。公式为:(x+a/x)/2
这种方法可以很有效地求出根号a的近似值:例如,我想求根号2等于多少。使用牛顿迭代法后这个值很快就趋近于根号2了:
(4 + 2 / 4) / 2 = 2.25
(2.25 + 2 / 2.25) / 2 = 1.56944…
(1.56944… + 2/1.56944…) / 2 = 1.42189…
(1.42189… + 2/1.42189…) / 2 = 1.41423…
代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;public class Main {/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception {String a = _07Reader.next();BigInteger N = new BigInteger(a);//下面的if语句不晓得干什么的,不带上会超时//如果输入的是偶数位的数,例如16if (N.toString().length() % 2 == 0) {//截取这两位数a = a.substring(0, N.toString().length()/2 + 1);}else {a = a.substring(0, (1+N.toString().length())/2);}BigInteger x = new BigInteger(a);BigInteger two = new BigInteger("2");//考虑输入是1的情况if (a == "1") {System.out.println(1);}else {//N - x^2 < 0的条件while (N.compareTo(x.multiply(x)) < 0) {//导入公式(x+a/x)/2x = x.add(N.divide(x)).divide(two);}System.out.println(x);}}}class _07Reader {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StringTokenizer tokenizer = new StringTokenizer("");static String next() throws Exception {while (!tokenizer.hasMoreTokens()) {tokenizer = new StringTokenizer(br.readLine());}return tokenizer.nextToken();}static String nextLine() throws Exception {return br.readLine();}static int nextInt() throws Exception {return Integer.parseInt(next());}}
拓展
这个是求BigDecimal平方根的方法,遇到这样的题再说吧,先放着…
JAVA BigDecimal使用牛顿迭代法计算平方根
51Nod-1166大数开平方(java版本)相关推荐
- 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错
下线最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错 cmd: mvn -v Exception in thread "main" ja ...
- linux 修改java版本_Linux 有问必答:如何在 Linux 中改变默认的 Java 版本
提问:当我尝试在Linux中运行一个Java程序时,我遇到了一个错误.看上去像程序编译所使用的Java版本与我本地的不同.我该如何在Linux上切换默认的Java版本? 当Java程序编译时,编译环境 ...
- java jnlp被阻止_JNLP应使用特定的Java版本,但会出现错误结果
我在这里面临一个问题.我想使用特殊版本来运行我们的 java webstart应用程序,但只需要一个jnlp. ("经过测试,- blabla我们不能使用新版本- blabla"随 ...
- Ubuntu/Debian 系统切换Java(JVM),修改Java版本,JAVA_HOME
http://blog.mypapit.net/2007/10/how-to-switch-between-different-java-jvm-in-ubuntu-and-debian-gnu-li ...
- mac os x java_Mac OS X和多个Java版本
守着一只汪 在Mac上管理多个Java版本的最简洁方法是使用Homebrew.在内Homebrew,使用:homebrew-cask 安装java的版本jenv 管理已安装的java版本如http:/ ...
- centos 更换java版本_centos7 更换jdk版本
查看java版本 java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...
- 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )
文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 在使用 Android 编译时技术 , 涉及 编译时注解 , 注解处理器 ; 开发注解处理器后 , 编译报如下警告 ; 该警告不会影响 ...
- 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )
文章目录 一.注解处理器 依赖 编译时注解 二.设置 注解处理器 支持的注解类型 三.设置 注解处理器 支持的 Java 版本 四.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 ...
- 【SmartJob】【隔离装置】WEB/统计程序和隔离程序共享服务器时的JAVA版本冲突问题
SmartJob.DmsWeb与SmartSys共享服务器容易引发Java版本冲突问题: Java版本不正确 UnsupportedClassVersionError Exception in thr ...
最新文章
- 综述:目标检测二十年
- PAT甲级1093 Count PAT‘s :[C++题解]DP、状态机模型dp
- 从RocketMQ看长轮询(Long Polling)
- 硬核分析|腾讯云原生OS内存回收导致关键业务抖动问题
- Highcharts数据表示(3)
- CF1260C-Infinite Fence【结论题】
- postgreSQL计算总数sum if case when
- 怎么更改wifi频段_wifi信号差?网速慢?这样做不浪费每一兆宽带
- springboot酒店管理信息系统答辩PPT模板
- 接口访问次数_如何基于spring开发自定义注解实现对接口访问频次限制?
- TypeScript笔记(1)——环境配置与第一个ts程序
- ubuntu16.04下ROS操作系统学习笔记(八)机器人SLAM与 Gmapping-Hector_slam-Cartographer--ORB_SLAM
- 遇见,那一份最美的眷恋
- 与计算机相关的伟人,计算机发展史上最有影响的伟人
- 畅享9能改鸿蒙,华为畅享9 root教程_畅享9卡刷root包来获取root权限的方法
- c语言设置字体时调用对话框,第1课用C语言函数编写对话框之一直接实践
- 最新研究:朝九晚五可能会让你的身心受到巨大伤害!
- rtx2060为什么叫智商卡_二哈拆家,却把自己卡在了沙发里,智商确实令人捉急...
- kafka 安装和启动
- win 雨滴 linux,Win10插件