『算法学习笔记』4th -8th day. 10道习题 & 常用数学函数

1.平均数 average

输入3个平均数,输出它们的平均值,保留3位小数。

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int a,b,c;
  5         scanf("%d%d%d",&a,&b,&c);
  6         printf("%.3f\n", (a+b+c)/3.0);
  7 }

注意:

(1)第6行 /3.0的地方实际上是整型/浮点型=浮点型 做了自动类型转换 如果写成 /3 就会报错:

exe1-1.c:6:2: 警告: 格式 ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat]

(2)printf 输出格式控制

printf()函数的一般形式为 : printf(“格式控制字符串”,输出列表项)

控制字符串分为格式说明和普通字符(原样输出)

每个格式说明都由%开头,以一个格式字符串结束。在此之间可以加入左对齐符号,前导补零符号,宽度及精度说明,输出长度修正及指定输出类型的格式字符

 %    -    0   m.n    1或h   格式字符

格式字符的详细说明如下

d 输出带符号的十进制整数

o 以八进制无符号形式输出整数

0x 或0X 以十六进制无符号形式输出整数 x则输出小写字母 X输出大写字母

u 以无符号十进制形式输出整数

c 输出一个字符

s 输出字符串的字符,直到遇到‘\0’,或者输出由精度指定的字符数

f  以小数形式输出单、双精度,隐含输出6位小数。若指定精度为0,则小数部分不输出

e 或E 以标准指数形式输出单、双精度数,数字部分的小数位数为6位。

g或G 系统自动! 采用%f或%e 以使输出宽度最小。


关于长度修正符号l

%ld 输出long

%lf 输出double

关于域宽和精度 m指输出数据的总宽度,n指浮点型数的小数位数。 默认n=6



2.温度 temperature

输入华氏温度f,输出对应的摄氏温度c ,保留3位小数。提示:c=5(f-32)/9

  1 #include<stdio.h>
  2 int main()
  3 {
  4         float a;
  5         scanf("%f",&a);
  6         printf("%.3f\n",5*(a-32)/9);
  7         return 0;
  8 }
注意:

输入格式控制

scanf()函数的一般形式为 : printf(“格式控制字符串”,地址列表)

控制字符含义和printf函数相似,但有不同之处,完整格式:

赋值抑制符 指定输入数据域宽  长度修正符  格式字符,符号如下

%  *  m.n  l或h   格式字符 

其中m表示输入数据的最大位数,系统截断换取输入。输入实型时n的小数点位数控制不可用。

长度修正符l 用于输入长整型数据及double型数据,加h用于输入短整型数据。


格式字符的详细说明如下

d,i  输入带符号十进制整数

o  输入八进制无符号整数

x或X  输入十六进制无符号整数, 大小写形式相同

u  输入无符号十进制整数

c  输入单个字符

s  输入字符串

f   输入实数,以小数或指数形式


3.连续和 sum

输入正整数n,输出1+2+3...+n的值。 

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int m,n,sum;
  5         scanf("%d", &m);
  6         for(n=1;n<=m;n++)
  7         {
  8                 sum+=n;
  9         }
 10         printf("%d\n", sum);
 11         return 0;
 12 }


4.正弦和余弦 sin cos

输入正整数n(n<360), 输出n度的正弦/余弦函数值。

在gcc环境下总是报错 链接外部库的方法-lm 是 link(链接)到 /usr/lib/libm.a 或 /usr/lib/libm.so 的意思,libm 是 library math 的意思

  1 #include<stdio.h>
  2 #include<math.h>
  3 int main()
  4 {
  5         double n,p,q,degree;
  6         scanf("%lf", &n);
  7         const double pi= 4.0 *atan(1.0);
  8         degree=n*pi/180;
  9         p=sin(degree);
 10         q=cos(degree);
 11         printf("%lf %lf\n",p,q);
 12         return 0;
 13 }

edward@edward:~/Desktop/Algorithm$ ./exe1-4
360
-0.000000 1.000000
edward@edward:~/Desktop/Algorithm$ ./exe1-4
0
0.000000 1.000000
edward@edward:~/Desktop/Algorithm$ ./exe1-4
90
1.000000 0.000000

注意:math.h 中定义常量M_PI,但这个常熟不是ANSI C的标准。


5.距离 distance

输入4个浮点数x1,x2,y1,y2 输出平面坐标系中点(x1,y1)到(x2,y2)的距离。

  1 #include<stdio.h>
  2 #include<math.h>
  3 int main()
  4 {
  5         float x1,x2,y1,y2,dis;
  6         scanf("%f%f%f%f", &x1,&y1,&x2,&y2);
  7         dis=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
  8         printf("%f\n",dis);
  9         return 0;
 10 }

编译链接gcc -o exe1-5 exe1-5.c -lm

运行 

edward@edward:~/Desktop/Algorithm$ ./exe1-5
1 1 2 2 
1.414214

6. 偶数 odd

检测输入的整数 是否为偶数 偶数输出yes 否则输出no。

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int a;
  5         scanf("%d",&a);
  6         if(a%2==0) printf("yes\n");
  7         else printf("no\n");
  8         return 0;
  9 }

除了求余还有什么好方法判断是奇数还是偶数呢? 我想要不就是奇数的平方为奇数,不过代价教大。


7.打折 discount

一件衣服95元,若消费满300,可打85折,输入购买件数,输出支付金额,保留2位小数.

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int a;
  5         float sum;
  6         scanf("%d", &a);
  7         sum=95*a;
  8         if(sum>300) printf("%.2f元\n", sum*0.85);
  9         else printf("%f元\n", sum);
 10         return 0;
 11 }

8.绝对值 abs

输入一个浮点数,输出它的绝对值,保留两位小数。

  函数名:abs
   功能:返回整型数的绝对值.
   用法:Abs(number)

直接用abs 处理浮点数肯定是不行的 考虑 平方后再开方。

  1 #include<stdio.h>
  2 #include<math.h>
  3 int main()
  4 {
  5         float a;
  6         scanf("%f", &a);
  7         printf("%.2f\n", sqrt(pow(a,2)));
  8         return 0;
  9 }
23.53454524
23.53
-32.4454         
32.45

补充:其实也可以用fabs(double x)函数计算


9.三角形 triangle

输入三角形的三边长度值(正整数),判断它是否能成为直角三角形的三个边长。

如果可以输出“yes” 如果不能 输出“no” 。如果根本无法否成三角形,输出“not a triangle”。

要判定是不是三角形 需要用到三角形两边之和大于第三边,两边之差的绝对值小于第三边。

  1 #include<stdio.h>
  2 #include<math.h>
  3 int  main()
  4 {
  5         int a, b,c;
  6         //先排序在判断两短边之和是否大于第三边 两边之差是否小于第三边
  7         scanf("%d%d%d",&a,&b,&c);
  8         int max, min, mid;
  9         max=a; if(max<b)max=b; if(max<c)max=c;
 10         min=a; if(min>b)min=b; if(min>c)min=c;
 11         mid=a+b+c-max-min;
 12         if((min+mid>max)&&(max-min<mid)&&(max-mid<min))
 13         {
 14                 float temp=sqrt(pow(min,2)+pow(mid,2));
 15                 if(temp==max)printf("yes\n"); //会自动转换max 为float型比较
 16                 else printf("no\n");
 17         }
 18         else printf("not a triangle\n");
 19         return 0;
 20 }


edward@edward:~/Desktop/Algorithm$ ./exe1-9
3 4 5
yes
edward@edward:~/Desktop/Algorithm$ ./exe1-9
4 5 6
no
edward@edward:~/Desktop/Algorithm$ ./exe1-9
1 2 3
not a triangle


10. 年份 year

输入年份,判断是否为润年,是输出yes 否则输出no

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int a;
  5         scanf("%d",&a);
  6         //四年一闰,百年不闰,四百年再闰
  7         if(a%100==0)
  8         {
  9                 if((a%4==0)&&(a%400==0)) printf("yes\n");
 10                 else printf("no\n");
 11         }
 12         else if(a%4==0) printf("yes");
 13         else printf("no\n");
 14         return 0;
 15 }


edward@edward:~/Desktop/Algorithm$ ./exe1-10
1900
no
edward@edward:~/Desktop/Algorithm$ ./exe1-10
2000
yes


==================================================我是分割线==================================================

补充C语言常用的数学函数

三角函数:(所有参数必须为弧度)
 
 1.acos
   函数申明:acos  (double x);
   用途:用来返回给定的 X 的反余弦函数。


 2.asin
   函数申明:asin  (double x);
   用途:用来返回给定的 X 的反正弦函数。


 3.atan 
   函数申明:atan  (double x);
   用途:用来返回给定的 X 的反正切函数。


 4.sin
   函数声明:sin   (double x);
   用途:用来返回给定的 X 的正弦值。


 5.cos
   函数声明:cos   (double x);
   用途:用来返回给定的 X 的余弦值。


 6.tan
   函数声明:tan   (double x);
   用途:用来返回给定的 X 的正切值。


 7.atan2
   函数声明:atan2 (double y, double x);
   用途:返回给定的 X 及 Y 坐标值的反正切值

感觉上面好罗嗦,其实只要记住 三角函数是针对弧度的 并且弧度值是double型的。其他函数:

其他函数
 
8.atof 
  函数名: atof  (const char *s);
  功  能: 把字符串转换成浮点数
  用  法: double atof(const char *nptr);
  程序例:
   #i nclude <stdlib.h>
   #i nclude <stdio.h>
   int main(void)
   {
    float arg,*point=&arg;
    float f;
    char *str = "12345.67";
    f = atof(str);
    printf("string = %s float = %f\n", str, f);
    return 0;
   }


 9. ceil  和 floor
   函数名: ceil  
                 floor 
   功  能: 向上舍入
        向下舍入
   用  法: double ceil(double x);
        double floor(double x);
   程序例:
   #i nclude<math.h>
   int main(void)
   {
    double number = 123.54;
    double down, up;
    down = floor(number);
    up = ceil(number);

    printf("original number     %5.2lf\n", number);
    printf("number rounded down %5.2lf\n", down);
    printf("number rounded up   %5.2lf\n", up);

    return 0;
  }该程序运行结果:original number     123.54
                   number rounded down 123.00
                   number rounded up   124.00
 


 10.fabs
    函数名:fabs
    功能:求浮点数x的绝对值.
    用法:fabs  (double x);


 11.fmod
    函数名: fmod
    功  能: 计算x对y的模, 即x/y的余数
    用  法: double fmod(double x, double y);
    程序例:
    #i nclude <stdio.h>
    #i nclude <math.h>
    int main(void)
    {
     double x = 5.0, y = 2.0;
     double result;
     result = fmod(x,y);
     printf("The remainder of (%lf / %lf) is \
          %lf\n", x, y, result);
     return 0;
    }


 12.abs
   函数名:abs
   功能:返回整型数的绝对值.
   用法:Abs(number)
        number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0.


幂指数:


 13.exp
    函数名:exp
    功能:返回 e 的 n 次幂.
    用法:exp   (double x);


 14.frexp
    函数名: frexp
    功  能: 把一个双精度数分解为尾数的指数
    用  法: double frexp(double value, int *eptr);
    程序例:
    #i nclude <math.h>
    #i nclude <stdio.h>
    int main(void)
    {
      double mantissa, number;
      int exponent;
      number = 8.0;
      mantissa = frexp(number, &exponent);
      printf("The number %lf is ", number);
      printf("%lf times two to the ", mantissa);
      printf("power of %d\n", exponent);
      return 0;
    }


 15.log
    函数名:log
    功 能: 自然对数函数ln(x) 
    用 法: double log(double x); 
    程序例:
    #i nclude <math.h>
    #i nclude <stdio.h>
    int main(void) 
    { 
     double result; 
     double x = 8.6872; 
     result = log(x); 
     printf("The natural log of %lf is %lf\n", x, result); 
     return 0; 
    }
   log(x,y)=ln(y)/ln(x)


 16.ldexp
    函数名: ldexp 
    功 能: 计算value*(2的exp幂 ).
    用 法: double ldexp(double value, int exp); 
    程序例: 
    #i nclude 
    #i nclude 
    int main(void) 
    { 
     double value; 
     double x = 2; 
/* ldexp raises 2 by a power of 3 then multiplies the result by 2 */ 
     value = ldexp(x,3); 
     printf("The ldexp value is: %lf\n", value); 
     return 0; 
    } 运行结果为:2*2^3=16.
 


 17.log10
    函数名:log10
    功能:返回以 10 为底的对数.
    用法:log10 (double x);


 18.sqrt
    函数名:sqrt
    功能:返回指定数字的平方根.
    用法:sqrt  (double x);


 19.modf
    函数名:modf
    功  能: 把数分为指数和尾数
    用  法: double modf(double value, double *iptr);
    程序例:
    #i nclude <math.h>
    #i nclude <stdio.h>
    int main(void)
   {
    double fraction, integer;
    double number = 100000.567;
    fraction = modf(number, &integer);
    printf("The whole and fractional parts of %lf are %lf and %lf\n",number, integer, fraction);
    return 0;
   }


 20.pow
    函数名:pow
    功能:返回指定数字的指定次幂.
    用法:pow   (double x, double y);(将返回x的y次幂)
 


双曲函数: 
 21.cosh
    函数名:cosh 
    功能:返回指定角度的双曲余弦值.
    用法:Double  Cosh(double x(以弧度计量的角度)) ;


 22.sinh
    函数名:sinh
    功能:返回指定角度的双曲正弦值。
    用法:sinh  (double x);(其中参数x必须为弧度制)
 
 23.tanh
     函数名:tanh
    功能:回指定角度的双曲正切值.
    用法:tanh  (double x);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值