Unix/Linux环境C编程入门教程(31) 数学函数带你战胜企业面试
1.函数介绍:
abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh()sqrt()tan()tanh()
| |
相关函数 | labs, fabs |
表头文件 | #include<stdlib.h> |
定义函数 | int abs (int j) |
函数说明 | abs()用来计算参数j的绝对值,然后将结果返回。 |
返回值 | 返回参数j的绝对值结果。 |
范例 | #ingclude <stdlib.h> |
执行 | |-12| = 12 |
| |
相关函数 | asin , atan , atan2 , cos , sin , tan |
表头文件 | #include <math.h> |
定义函数 | double acos (double x); |
函数说明 | acos()用来计算参数x的反余弦值,然后将结果返回。参数x范围为-1至1之间,超过此范围则会失败。 |
返回值 | 返回0至PI之间的计算结果,单位为弧度,在函数库中角度均以弧度来表示。 |
错误代码 | EDOM参数x超出范围。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include <math.h> |
执行 | angle = 1.047198 |
| |
相关函数 | acos , atan , atan2 , cos , sin , tan |
表头文件 | #include <math.h> |
定义函数 | double asin (double x) |
函数说明 | asin()用来计算参数x的反正弦值,然后将结果返回。参数x范围为-1至1之间,超过此范围则会失败。 |
返回值 | 返回-PI/2之PI/2之间的计算结果。 |
错误代码 | EDOM参数x超出范围 |
附加说明 | 使用GCC编译时请加入-lm |
范例 | #include<math.h> |
执行 | angle = 0.523599 |
| |
相关函数 | acos,asin,atan2,cos,sin,tan |
表头文件 | #include<math.h> |
定义函数 | double atan(double x); |
函数说明 | atan()用来计算参数x的反正切值,然后将结果返回。 |
返回值 | 返回-PI/2至PI/2之间的计算结果。 |
附加说明 | 使用GCC编译时请加入-lm |
范例 | #include<math.h> |
执行 | angle = 1.570796 |
| |
相关函数 | acos,asin,atan,cos,sin,tan |
表头文件 | #include<math.h> |
定义函数 | double atan2(double y,double x); |
函数说明 | atan2()用来计算参数y/x的反正切值,然后将结果返回。 |
返回值 | 返回-PI/2 至PI/2 之间的计算结果。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | angle = 0.463648 |
| |
相关函数 | fabs |
表头文件 | #include <math.h> |
定义函数 | double ceil (double x); |
函数说明 | ceil()会返回不小于参数x的最小整数值,结果以double形态返回。 |
返回值 | 返回不小于参数x的最小整数值。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | 4.800000=>5.000000 |
| |
相关函数 | acos,asin,atan,atan2,sin,tan |
表头文件 | #include<math.h> |
定义函数 | double cos(double x); |
函数说明 | cos()用来计算参数x 的余玄值,然后将结果返回。 |
返回值 | 返回-1至1之间的计算结果。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | cos(0.5) = 0.877583 |
| |
相关函数 | sinh,tanh |
表头文件 | #include<math.h> |
定义函数 | double cosh(double x); |
函数说明 | cosh()用来计算参数x的双曲线余玄值,然后将结果返回。数学定义式为:(exp(x)+exp(-x))/2。 |
返回值 | 返回参数x的双曲线余玄值。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | cosh(0.5) = 1.127626 |
| |
相关函数 | log,log10,pow |
表头文件 | #include<math.h> |
定义函数 | double exp(double x); |
函数说明 | exp()用来计算以e为底的x次方值,即ex值,然后将结果返回。 |
返回值 | 返回e的x次方计算结果。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | e^10 = 22026.465795 |
| |
相关函数 | ldexp,modf |
表头文件 | #include<math.h> |
定义函数 | double frexp( double x, int *exp); |
函数说明 | frexp()用来将参数x 的浮点型数切割成底数和指数。底数部分直接返回,指数部分则借参数exp 指针返回,将返回值乘以2 的exp次方即为x的值。 |
返回值 | 返回参数x的底数部分,指数部分则存于exp指针所指的地址。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include <math.h> |
执行 | exp = 11 |
| |
相关函数 | frexp |
表头文件 | #include<math.h> |
定义函数 | double ldexp(double x,int exp); |
函数说明 | ldexp()用来将参数x乘上2的exp次方值,即x*2exp。 |
返回值 | 返回计算结果。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例: | /* 计算3*(2^2)=12 */ |
执行 | 3*2^(2) = 12.000000 |
| |
相关函数 | exp,log10,pow |
表头文件 | #include <math.h> |
定义函数 | double log (double x); |
函数说明 | log()用来计算以e为底的x 对数值,然后将结果返回。 |
返回值 | 返回参数x的自然对数值。 |
错误代码 | EDOM 参数x为负数,ERANGE 参数x为零值,零的对数值无定义。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | log(100) = 4.605170 |
| |
相关函数 | exp,log,pow |
表头文件 | #include<math.h> |
定义函数 | double log10(double x); |
函数说明 | log10()用来计算以10为底的x对数值,然后将结果返回。 |
返回值 | 返回参数x以10为底的对数值。 |
错误代码 | EDOM参数x为负数。RANGE参数x为零值,零的对数值无定义。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | log10(100) = 2.000000 |
| |
相关函数 | exp,log,log10 |
表头文件 | #include<math.h> |
定义函数 | double pow(double x,double y); |
函数说明 | pow()用来计算以x为底的y次方值,即xy值,然后将结果返回。 |
返回值 | 返回x的y次方计算结果。 |
错误代码 | EDOM 参数x为负数且参数y不是整数。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include <math.h> |
执行 | 2^10 = 1024.000000 |
| |
相关函数 | acos,asin,atan,atan2,cos,tan |
表头文件 | #include<math.h> |
定义函数 | double sin(double x); |
函数说明 | sin()用来计算参数x的正玄值,然后将结果返回。 |
返回值 | 返回-1 至1之间的计算结果。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | sin(0.5) = 0.479426 |
| |
相关函数 | cosh,tanh |
表头文件 | #include<math.h> |
定义函数 | double sinh( double x); |
函数说明 | sinh()用来计算参数x的双曲线正玄值,然后将结果返回。数学定义式为:(exp(x)-exp(-x))/2。 |
返回值 | 返回参数x的双曲线正玄值。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | sinh(0.5) = 0.521095 |
| |
相关函数 | hypotq |
表头文件 | #include<math.h> |
定义函数 | double sqrt(double x); |
函数说明 | sqrt()用来计算参数x的平方根,然后将结果返回。参数x必须为正数。 |
返回值 | 返回参数x的平方根值。 |
错误代码 | EDOM 参数x为负数。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | /* 计算200的平方根值*/ |
执行 | answer is 14.142136 |
| |
相关函数 | atan,atan2,cos,sin |
表头文件 | #include <math.h> |
定义函数 | double tan(double x); |
函数说明 | tan()用来计算参数x的正切值,然后将结果返回。 |
返回值 | 返回参数x的正切值。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | tan(0.5) = 0.546302 |
| |
相关函数 | cosh,sinh |
表头文件 | #include<math.h> |
定义函数 | double tanh(double x); |
函数说明 | tanh()用来计算参数x的双曲线正切值,然后将结果返回。数学定义式为:sinh(x)/cosh(x)。 |
返回值 | 返回参数x的双曲线正切值。 |
附加说明 | 使用GCC编译时请加入-lm。 |
范例 | #include<math.h> |
执行 | tanh(0.5) = 0.462117 |
|
2.企业面试实战演练
题目如下:
现有1个点和10000个位置半径各不同的圆,为了判断改点被包含在哪些圆内,需要一个函数判断点(px,py)是否于圆心(x,y)半径r的圆内,请尽快优化运行速度。
函数原型:
bool IsPointInCircle(int px,int py,int x,int y,int r);
流程设计如下:
采用模块化的设计思想,我们创建1个函数
int CreateCircle(int n);
CreateCircle函数功能就是接受参数n并创建n个圆圈,圆心坐标随机产生,半径也随机产生
将创建好的圆圈与点(px,py)进行游戏中的 "碰撞检测"
我们加上本专题的第一篇博客测试程序运行时间。经过本人测试发现10000个圆圈根本就测试不出时间,所以我们在项目中改成了1000,000个圆圈。
另外C语言中没有内建类型bool 所以我们需要换成int
项目实现
#include <stdio.h> #include <math.h> #include <time.h> #include <stdlib.h> int main(void) { int CreateCircle(int n,int px,int py); int IsPointInCircle(int px,int py,int x,int y,int r); clock_t t; printf ("Begin clock...\n"); t = clock();//第一个clock() t表示从程序启动到现在这个时刻的时间 CreateCircle(1000000,50,25); t = clock() - t;//第二次调用clock()减去第一次获得的t的差值为两次掐表的间隔 printf ("\nIt took %d clicks (%f seconds) to test.\n",t,((float)t)/CLOCKS_PER_SEC); return 0; } int IsPointInCircle(int px,int py,int x,int y,int r) { double distance = sqrt(pow(py-y,2)+pow(px-x,2)); if(distance -r >0.00001) //减去double类型的误差 再比较大小 return 0; //返回0 便是不在圆内 else return 1; //返回1 在圆内 } int CreateCircle(int n,int px,int py) { int r ; //r用来缓冲临时产生圆圈的半径 int x; //x用来缓冲临时产生圆圈的圆心横坐标 int y; //y用来缓冲临时产生圆圈的圆心纵坐标 int iCount = 0; //计数产生圆圈的个数 srand(time(NULL)); //初始化随即种子 while(iCount < n) { x = rand()%1000; // rand()函数就是返回一个随机数 y = rand()%1000; r = rand()%100; if(IsPointInCircle(px,py,x,y,r)) //如果在圆内 printf("%din",iCount); //打印出他在圆内 ++iCount; } }
3.在各个平台的运行的情况
在RHEL7上
在REHL6上
在Solaris11上
在MAC上
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。