51nod 1166 大数开平方(高精度+牛顿迭代法)

分析:直接用二分还是会T,用更快的牛顿迭代法。把问题转化为求x^2-n=0的根,假设解为x0,当前解为x且x^2-n>0,在(x,x^2-n)处作切线,与x轴交点横坐标为新的x,然后迭代即可,比二分法快,但是貌似只能用在凹函数或凸函数上。。

java水高精度真是666。。。

 1 import java.io.*;
 2 import java.util.*;
 3 import java.math.BigInteger;
 4 public class Main {
 5     public static void main(String[] args){
 6         Scanner cin=new Scanner(System.in);
 7         String a;
 8         a=cin.next();
 9         BigInteger n=new BigInteger(a);
10         if(n.toString().length()%2==0)
11             a=a.substring(0,n.toString().length()/2+1);
12         else
13             a=a.substring(0,(1+ n.toString().length())/2);
14         BigInteger x=new BigInteger(a);
15         BigInteger Two=new BigInteger("2");
16         if(a=="1"){
17             System.out.println(1);
18         }else{
19             while(n.compareTo(x.multiply(x))<0){
20                 x=(x.add(n.divide(x))).divide(Two);
21             }
22             System.out.println(x);
23         }
24         cin.close();
25     }
26 }
时间: 2025-01-23 15:32:14

51nod 1166 大数开平方(高精度+牛顿迭代法)的相关文章

蓝桥杯练习系统 矩阵翻硬币 大数,牛顿迭代法 难度:2

http://lx.lanqiao.org/problem.page?gpid=T126 明显,对于一个格子(i,j),设f(i)为i的约数个数,则(i,j)的翻转次数为(f(i)-1)*(f(j)-1)+1, 而只有翻转次数为奇数,也就是f(i),f(j)都为奇数的格子开始才是反面, 又因为f(i)为奇数当且仅当i为完全平方数,所以只需统计n,m中各有多少个完全平方数,然后相乘即可, 也就是sqrt(n)*sqrt(m), 但是因为n,m是大数,必须要用大数方法解决,这里采用了java的Big

牛顿迭代法与一道经典编程问题

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method).它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. 既然牛顿迭代法能够用来求解方程的根,那么最好还是以方程 x2=n 为例,来试着求解它的根. 为此. 令f(x)=x2?n, 也就是相当于求解 f(x)=0 的解.如上图所看到的. 首先随便找一个初始值 x0,假设 x0不是解,做一个经过 (x0,f(x0)) 这个点的切线,与x轴的交点为x1.相同的道理.假

【leetcode】【二分 | 牛顿迭代法】69_Sqrt(x)

题目链接:传送门 题目描述: 求Sqrt(x),返回整数值即可. [代码]: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 1e6+10 ; 4 /* 5 int mySqrt ( int x ){ 6 int L = 1 , R = N , mid , ans = 0 ; 7 while ( L <= R ){ 8 mid = ( L + R ) >> 1 ; 9 if( mid <=

牛顿迭代法求解平方根

牛顿迭代法求解平方根 2015-05-16 10:30 2492人阅读 评论(1) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一个实例 迭代简介 牛顿迭代法 牛顿迭代法简介 简单推导 泰勒公式推导 延伸与应用 一个实例 //java实现的sqrt类和方法 public class sqrt { public static double sqrt(double n) { if (n<0) return Double.NaN; double err = 1e

经典算法:牛顿迭代法求平方根

//牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/(2*x); 7 y = x*x-num; 8 if(y<0) y = -y; 9 } while(y>0.0001); 10 return x; 11 } 12 int main(int argc, char* argv[]) 13 { 14 printf("%.3f",my

牛顿迭代法(Newton&#39;s Method)

牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.但是,这一方法在牛顿生前并未公开发表. 牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. 对于形如f(x)=0的方程,首先任意估算一个解x0,再把该估计值代入原方程中.由于一般不会正好选择到正确的解,所以有f(x)=a.这时计算函数在x0处的斜率,和这条斜率与x轴的交点x1. f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即f(x)的

C语言实现牛顿迭代法解方程

利用迭代算法解决问题,需要做好以下三个方面的工作: 一.确定迭代变量 在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 三.对迭代过程进行控制 在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地执行下去.迭代过程的控制通常可分为两种情况

sqrt (x) 牛顿迭代法

参考: 0开方 是 0 1的开方式 1 2的开方式 1.4 3.的开方=(1.4+3/1.4)/2 牛顿迭代法:学习自 http://blog.csdn.net/youwuwei2012/article/details/34075241 public class Solution { public int sqrt(int x) { if(x==0)return 0; double pre=0; double cur=1; while(Math.abs(cur-pre)>0.000001) {

Atitit 迭代法&#160;&#160;“二分法”和“牛顿迭代法&#160;attilax总结

Atitit 迭代法  "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1.2. 直接法(或者称为一次解法),即一次性的快速解决问题,1 1.3. 最常见的迭代法是"二分法 牛顿法.还包括以下算法1 1.4.  二分法(dichotomie)1 1.5. 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method