服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 详细解析C语言中的开方实现

详细解析C语言中的开方实现

2021-03-05 15:27zinss26914 C/C++

这篇文章主要介绍了详细解析C语言中的开方实现,包括一道要求精度的整数开方的题目,需要的朋友可以参考下

关于C语言中的开方计算,首先想到的当然是sqrt()函数,让我们先来回顾一下它的基本用法:
头文件:#include <math.h>

sqrt() 用来求给定值的平方根,其原型为:

?
1
double sqrt(double x);

参数

x 为要计算平方根的值。

如果 x < 0,将会导致 domain error 错误,并把全局变量 errno 的值为设置为 EDOM。

返回值

返回 x 平方根。

注意,使用 GCC 编译时请加入-lm。

实例计算200 的平方根值。

?
1
2
3
4
5
6
#include <math.h>
main(){
  double root;
  root = sqrt(200);
  printf("answer is %f\n", root);
}

输出结果:
answer is 14.142136

题目
求整数N的开方,精度在0.001

二分法
若N大于1,则从[1, N]开始,low = 1, high = N, mid = low + (high - low) >> 1开始进行数值逼近

若N小于1,则从[N, 1]开始,low = 0, high = N, mid = low + (high - low) >> 1开始进行数值逼近

ac代码

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
  * 创新工厂2014年校招算法题目,求整数N的开方,精度为0.001
  */
  
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
  
 #define ACCURACY 0.001
  
 double newSqrt(double n)
 {
   double low, high, mid, tmp;
  
   // 获取上下界
   if (n > 1)  {
     low = 1;
     high = n;
   } else {
     low = n;
     high = 1;
   }
  
   // 二分法求开方
   while (low <= high) {
     mid = (low + high) / 2.000;
  
     tmp = mid * mid;
  
     if (tmp - n <= ACCURACY && tmp -n >= ACCURACY * -1) {
       return mid;
     } else if (tmp > n) {
       high = mid;
     } else {
       low = mid;
     }
   }
  
   return -1.000;
 }
  
 int main(void)
 {
   double n, res;
  
   while (scanf("%lf", &n) != EOF) {
     res = newSqrt(n);
     printf("%lf\n", res);
   }
  
   return 0;
 }

延伸 · 阅读

精彩推荐