天天看點

『算法學習筆記』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 }
           

[email protected]:~/Desktop/Algorithm$ ./exe1-4

360

-0.000000 1.000000

[email protected]:~/Desktop/Algorithm$ ./exe1-4

0.000000 1.000000

[email protected]:~/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

運作 

[email protected]:~/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 }

           

[email protected]:~/Desktop/Algorithm$ ./exe1-9

3 4 5

yes

[email protected]:~/Desktop/Algorithm$ ./exe1-9

4 5 6

no

[email protected]:~/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 }
           

[email protected]:~/Desktop/Algorithm$ ./exe1-10

1900

no

[email protected]:~/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; 

     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);

繼續閱讀