不使用库函数sqrt实现求一个数的平方根

二分法:

double mysqrt(double a)
{
    if(a == 0 ) return 0;
    double precision = 1.0e-7, start = 0, end = a;
    if(a < 1) end = 1;
    while(end - start > precision)
    {
        double mid = (start + end) / 2;
        if( mid == a / mid) return mid;
        else if(mid > a/mid) end = mid;
        else start = mid;
    }
    return (start + end)/2;
}

牛顿迭代:

/*  牛顿法求解 */
#define E 0.0000001
double newton(double number, int *count)  //*count 可统计出迭代次数
{
    double x0 = number;
    double x1;
    if(x0<E)return 0;
    while(true)
    {
        (*count)++;
        x1 = -(x0*x0 - number) / (2 * x0) + x0;
        //x1 = (x0*x0 + number) / (2 * x0)
        if(x1 * x1 - number <= E && x1 * x1 - number >= -E)
            return x1;
        x0 = x1;
    }
    return 0;
}        

不使用库函数sqrt实现求一个数的平方根,布布扣,bubuko.com

时间: 2024-12-24 10:54:29

不使用库函数sqrt实现求一个数的平方根的相关文章

如何用牛顿法求一个数的平方根

SCIP 1.1.7的一个练习. 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法.多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要.方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根.牛顿迭代法老品牌娱乐城是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以

java的二分法求一个数的平方根

class Solution { public int mySqrt(int x) { // 注意:针对特殊测试用例,例如 2147395599 // 要把搜索的范围设置成长整型 // 为了照顾到 0 把左边界设置为 0 long left = 0; // # 为了照顾到 1 把右边界设置为 x // 2 + 1 long right = x / 2 + 1; //对于一个非负数n,它的平方根不会大于(n/2+1) while (left < right) { //在left与right中寻找

不使用库函数求一个数的立方根

面试题:不使用库函数求一个数的立方根. 解法:二分法. 1 double fun(double x) { 2 if (x == 0) return 0; 3 double low = 0; 4 double top = x; 5 if (x < 0) { 6 low = x; 7 top = 0; 8 } 9 while (low<top) 10 { 11 double mid = (low + top) / 2; 12 double tmp = mid*mid*mid; 13 if (tmp

求一个数阶乘的位数

flyfish 2015-8-15 例如 7!=5040 ,7的阶乘结果是4位数(10进制) 求一个数的位数 1 循环方法 int get_digit_loop(int N) { int digit = 0; do { digit ++; } while ((N /= 10) > 0); return digit; } 2 递归方式 int get_digit_recursion(int N) { int digit = 0; digit = N < 10 ? 1 : 1 + get_digi

求两个数的最大公约数

求两个数的最大公约数 问题:给定两个正整数a和b,求他们的最大公约数. 最简单的方法就是穷举法,如果a>b,那么依次计算1~b的所有整数是否是a和b的公约数. public static void main(String[] args) { long timer = System.currentTimeMillis(); System.out.println(getGCB(1000234234,1242342390)); System.out.println(System.currentTime

求一个数的最大素因子(python实现)

首先想到的是,将这个数进行素因子分解,得到所有的因子,然后取最大的. 首先写一个判断一个数是否是素数的方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #judge a number whether a prime     def judgePrime(self,number,pme):         if number < 2:             return False;         if number

求一个数阶乘后位数问题

问题:In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of digits in the fa

poj 1845 Sumdiv (算术基本定理求一个数因子和)

求一个数的所有因子和可以用算术基本定理,下面是它的两个重要应用: (1)一个大于1的正整数N,如果它的标准分解式为: N=(P1^a1)*(P2^a2)......(Pn^an) 那么它的正因数个数为(1+a1)(1+a2).....(1+an). (2) 它的全体正因数之和为d(N)=(1+p1+...p1^an)(1+p2+...p2^a2)...(1+pn+...+pn^an) 和求一个数正因数个数的方法类似. 可以先打表出sqrt(n)以内的所有素数(当然也可以不打表),因为n的素因数中

AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】

D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us choose some number of positive common divisors of AA and BB. Here, any two of the chosen divisors must be coprime. At most, how many divisors can we c