zoukankan      html  css  js  c++  java
  • Unix/Linux环境C编程入门教程(31) 数学函数带你战胜企业面试

    1.函数介绍:

    abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh()sqrt()tan()tanh()

       



    abs(计算整型数的绝对值)

    相关函数

    labs, fabs

    表头文件

    #include<stdlib.h>

    定义函数

    int abs (int j)

    函数说明

    abs()用来计算参数j的绝对值,然后将结果返回。

    返回值

    返回参数j的绝对值结果。

    范例

    #ingclude <stdlib.h>
    main(){
    int ansert;
    answer = abs(-12);
    printf("|-12| = %d ", answer);
    }

    执行

    |-12| = 12

       




    acos(取反余弦函数数值)

    相关函数

    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>
    main (){
    double angle;
    angle = acos(0.5);
    printf("angle = %f ", angle);
    }

    执行

    angle = 1.047198

       




    asin(取反正弦函数值)

    相关函数

    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>
    main()
    {
    double angle;
    angle = asin (0.5);
    printf("angle = %f ",angle);
    }

    执行

    angle = 0.523599

       




    atan(取反正切函数值)

    相关函数

    acos,asin,atan2,cos,sin,tan

    表头文件

    #include<math.h>

    定义函数

    double atan(double x);

    函数说明

    atan()用来计算参数x的反正切值,然后将结果返回。

    返回值

    返回-PI/2至PI/2之间的计算结果。

    附加说明

    使用GCC编译时请加入-lm

    范例

    #include<math.h>
    main()
    {
    double angle;
    angle =atan(1);
    printf("angle = %f ",angle);
    }

    执行

    angle = 1.570796

       




    atan2(取得反正切函数值)

    相关函数

    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>
    main()
    {
    double angle;
    angle = atan2(1,2);
    printf("angle = %f ", angle);
    }

    执行

    angle = 0.463648

       




    ceil(取不小于参数的最小整型数)

    相关函数

    fabs

    表头文件

    #include <math.h>

    定义函数

    double ceil (double x);

    函数说明

    ceil()会返回不小于参数x的最小整数值,结果以double形态返回。

    返回值

    返回不小于参数x的最小整数值。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double value[ ]={4.8,1.12,-2.2,0};
    int i;
    for (i=0;value[i]!=0;i++)
    printf("%f=>%f ",value[i],ceil(value[i]));
    }

    执行

    4.800000=>5.000000
    1.120000=>2.000000
    -2.200000=>-2.000000

       




    cos(取余玄函数值)

    相关函数

    acos,asin,atan,atan2,sin,tan

    表头文件

    #include<math.h>

    定义函数

    double cos(double x);

    函数说明

    cos()用来计算参数x 的余玄值,然后将结果返回。

    返回值

    返回-1至1之间的计算结果。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer = cos(0.5);
    printf("cos (0.5) = %f ",answer);
    }

    执行

    cos(0.5) = 0.877583

       




    cosh(取双曲线余玄函数值)

    相关函数

    sinh,tanh

    表头文件

    #include<math.h>

    定义函数

    double cosh(double x);

    函数说明

    cosh()用来计算参数x的双曲线余玄值,然后将结果返回。数学定义式为:(exp(x)+exp(-x))/2。

    返回值

    返回参数x的双曲线余玄值。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer = cosh(0.5);
    printf("cosh(0.5) = %f ",answer);
    }

    执行

    cosh(0.5) = 1.127626

       




    exp(计算指数)

    相关函数

    log,log10,pow

    表头文件

    #include<math.h>

    定义函数

    double exp(double x);

    函数说明

    exp()用来计算以e为底的x次方值,即ex值,然后将结果返回。

    返回值

    返回e的x次方计算结果。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer;
    answer = exp (10);
    printf("e^10 =%f ", answer);
    }

    执行

    e^10 = 22026.465795

       




    frexp(将浮点型数分为底数与指数)

    相关函数

    ldexp,modf

    表头文件

    #include<math.h>

    定义函数

    double frexp( double x, int *exp);

    函数说明

    frexp()用来将参数x 的浮点型数切割成底数和指数。底数部分直接返回,指数部分则借参数exp 指针返回,将返回值乘以2 的exp次方即为x的值。

    返回值

    返回参数x的底数部分,指数部分则存于exp指针所指的地址。

    附加说明

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

    范例

    #include <math.h>
    main()
    {
    int exp;
    double fraction;
    fraction = frexp (1024,&exp);
    printf("exp = %d ",exp);
    printf("fraction = %f ", fraction);
    }

    执行

    exp = 11
    fraction = 0.500000 /* 0.5*(2^11)=1024*/

       




    ldexp(计算2的次方值)

    相关函数

    frexp

    表头文件

    #include<math.h>

    定义函数

    double ldexp(double x,int exp);

    函数说明

    ldexp()用来将参数x乘上2的exp次方值,即x*2exp。

    返回值

    返回计算结果。

    附加说明

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

    范例:

    /* 计算3*(2^2)=12 */
    #include<math.h>
    main()
    {
    int exp;
    double x,answer;
    answer = ldexp(3,2);
    printf("3*2^(2) = %f ",answer);
    }

    执行

    3*2^(2) = 12.000000

       




    log(计算以e 为底的对数值)

    相关函数

    exp,log10,pow

    表头文件

    #include <math.h>

    定义函数

    double log (double x);

    函数说明

    log()用来计算以e为底的x 对数值,然后将结果返回。

    返回值

    返回参数x的自然对数值。

    错误代码

    EDOM 参数x为负数,ERANGE 参数x为零值,零的对数值无定义。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer;
    answer = log (100);
    printf("log(100) = %f ",answer);
    }

    执行

    log(100) = 4.605170

       




    log10(计算以10 为底的对数值)

    相关函数

    exp,log,pow

    表头文件

    #include<math.h>

    定义函数

    double log10(double x);

    函数说明

    log10()用来计算以10为底的x对数值,然后将结果返回。

    返回值

    返回参数x以10为底的对数值。

    错误代码

    EDOM参数x为负数。RANGE参数x为零值,零的对数值无定义。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer;
    answer = log10(100);
    printf("log10(100) = %f ",answer);
    }

    执行

    log10(100) = 2.000000

       




    pow(计算次方值)

    相关函数

    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>
    main()
    {
    double answer;
    answer =pow(2,10);
    printf("2^10 = %f ", answer);
    }

    执行

    2^10 = 1024.000000

       




    sin(取正玄函数值)

    相关函数

    acos,asin,atan,atan2,cos,tan

    表头文件

    #include<math.h>

    定义函数

    double sin(double x);

    函数说明

    sin()用来计算参数x的正玄值,然后将结果返回。

    返回值

    返回-1 至1之间的计算结果。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer = sin (0.5);
    printf("sin(0.5) = %f ",answer);
    }

    执行

    sin(0.5) = 0.479426

       




    sinh(取双曲线正玄函数值)

    相关函数

    cosh,tanh

    表头文件

    #include<math.h>

    定义函数

    double sinh( double x);

    函数说明

    sinh()用来计算参数x的双曲线正玄值,然后将结果返回。数学定义式为:(exp(x)-exp(-x))/2。

    返回值

    返回参数x的双曲线正玄值。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer = sinh (0.5);
    printf("sinh(0.5) = %f ",answer);
    }

    执行

    sinh(0.5) = 0.521095

       




    sqrt(计算平方根值)

    相关函数

    hypotq

    表头文件

    #include<math.h>

    定义函数

    double sqrt(double x);

    函数说明

    sqrt()用来计算参数x的平方根,然后将结果返回。参数x必须为正数。

    返回值

    返回参数x的平方根值。

    错误代码

    EDOM 参数x为负数。

    附加说明

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

    范例

    /* 计算200的平方根值*/
    #include<math.h>
    main()
    {
    double root;
    root = sqrt (200);
    printf("answer is %f ",root);
    }

    执行

    answer is 14.142136

       




    tan(取正切函数值)

    相关函数

    atan,atan2,cos,sin

    表头文件

    #include <math.h>

    定义函数

    double tan(double x);

    函数说明

    tan()用来计算参数x的正切值,然后将结果返回。

    返回值

    返回参数x的正切值。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer = tan(0.5);
    printf("tan (0.5) = %f ",answer);
    }

    执行

    tan(0.5) = 0.546302

       




    tanh(取双曲线正切函数值)

    相关函数

    cosh,sinh

    表头文件

    #include<math.h>

    定义函数

    double tanh(double x);

    函数说明

    tanh()用来计算参数x的双曲线正切值,然后将结果返回。数学定义式为:sinh(x)/cosh(x)。

    返回值

    返回参数x的双曲线正切值。

    附加说明

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

    范例

    #include<math.h>
    main()
    {
    double answer = tanh(0.5);
    printf("tanh(0.5) = %f ",answer);
    }

    执行

    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...
    ");
    
     
    
     	t = clock();//第一个clock() t表示从程序启动到现在这个时刻的时间
    
    	CreateCircle(1000000,50,25);
    
     	t = clock() - t;//第二次调用clock()减去第一次获得的t的差值为两次掐表的间隔
    
    	printf ("
    It took %d clicks (%f seconds) to test.
    ",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上

  • 相关阅读:
    ubuntu16.04安装mongodb
    redis 允许远程链接
    mongodb将一个集合的数据加入到另外一个集合
    记录一次字符的坑
    Linux定时任务指定用户
    laravel 除了根目录,所有接口地址都是404
    记录一次php7-mongodb扩展的坑
    nginx 解决跨域
    记录一次部署
    MAC或者linux通过SSH使用PEM文件登录
  • 原文地址:https://www.cnblogs.com/new0801/p/6177052.html
Copyright © 2011-2022 走看看