C语言刷题(2)——“C”

简介: C语言刷题(2)——“C”

各位CSDN的uu们你们好呀,今天小雅兰来复习一下之前所学过的内容噢,复习的方式,那当然是刷题啦,现在,就让我们进入C语言的世界吧


当然,题目还是来源于牛客网


完完全全零基础


编程语言初学训练营_在线编程+题解_牛客题霸_牛客网


BC10 成绩输入输出


BC20 kiki算数


BC21 浮点数的个位数字


BC22 你能活多少秒


BC23 时间转换


BC24 总成绩和平均分计算


BC25 计算体重指数


BC26 计算三角形的周长和面积


BC27 计算球体的体积


BC30 KiKi和酸奶


BC31 发布信息


BC32 输出学生信息


BC33 计算平均成绩


BC34 进制A+B


BC37 网购


BC38 变种水仙花


BC39 争夺前五名

50de340a654248eb98e30d9faad5f05d.png

其实上次复习的时候,我们也做过这个题目,当时我们是这么来写的:

#include <stdio.h>
int main()
{
    int score1=60;
    int score2=80;
    int score3=90;
    scanf("%d %d %d",&score1,&score2,&score3);
    printf("score1=%d,score2=%d,score3=%d",score1,score2,score3);
    return 0;
}

仔细想一想,这样写的效率是非常低的,如果有五十科成绩呢,难道输入五十次打印五十次吗?这显然是不现实的,那么,就应该用循环的方法。

#include<stdio.h>
int main()
{
  int score[3] = { 0 };
  //0 1 2
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    scanf("%d", &score[i]);
  }
  printf("score1=%d,score2=%d,score3=%d\n", score[0], score[1], score[2]);
  return 0;
}

5df69b0f33054af4865e078027981c3e.png

#include<stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  int sum = (a % 100 + b % 100) % 100;
  printf("%d\n", sum);
  return 0;
}

也可以这样写:

#include <stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  int c = (a + b) % 100;
  printf("%d\n", c);
  return 0;
}

29a58b0e9743425a99af37b8a9679c27.png

#include<stdio.h>
int main()
{
  double d = 0.0;
  scanf("%lf", &d);
  int n = (int)d;
  printf("%d\n", n % 10);
  return 0;
}

00eb7470cf3a47d0ae5b79ec0d626393.png

#include<stdio.h>
int main()
{
  int age = 0;
  scanf("%d", &age);
  long long second = age * 3.156e7;
  printf("%lld\n", second);
  return 0;
}

3fbc3722784f49edbfb00e7209105a31.png

#include<stdio.h>
int main()
{
  int seconds = 0;
  scanf("%d", &seconds);
  int h = 0;//小时
  int m = 0;//分钟
  int s = 0;//秒
  //计算
  h = seconds / 60 / 60;
  m = seconds / 60 % 60;
  s = seconds % 60;
  printf("%d %d %d", h, m, s);
  return 0;
}

计算好对应的数字,按照格式打印就行。

2e40526c0ce04eb5ab6511be9894ae7c.png

#include<stdio.h>
int main()
{
  double score[3] = { 0 };
  scanf("%lf %lf %lf", &score[0], &score[1], &score[2]);
  double sum = score[0] + score[1] + score[2];
  double avg = sum / 3.0;
  printf(".2lf .2lf\n", sum, avg);
  return 0;
}

另一种写法:

#include<stdio.h>
int main()
{
  double score = 0.0;
  double sum = 0.0;
  double avg = 0.0;
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    scanf("%lf", &score);
    sum += score;
  }
  avg = sum / 3.0;
  printf("%.2lf %.2lf\n", sum, avg);
  return 0;
}

1. 本题在接收数据的同时就可以计算分数的总和,不一定非要等数据全部接收完毕。

2. 按照格式打印就行。

29289e2504a34081a8f49f6c8c6eba42.png

#include<stdio.h>
int main()
{
  int weight = 0;
  int high = 0;
  double BMI = 0;
  scanf("%d %d", &weight, &high);
  //计算BMI
  BMI = weight / ((high / 100) * (high / 100));
  printf("%.2lf\n", BMI);
  return 0;
}

要得到浮点数,要进行浮点数除法,这里就得保证 / 两端的操作数至少有一个数是浮点数。59c90410d454414e97b0c8001c1c0373.png

在做这道题目的过程中,我们需要求三角形的面积,但是这道题目根本没有说它是一个什么三角形,那么这个面积该如何求呢?这就要用到海伦公式。


海伦公式又译作希伦公式、海龙公式、希罗公式、海伦-秦九韶公式。它是利用三角形的三条边的边长直接求三角形面积的公式。表达式为:S=√p(p-a)(p-b)(p-c),它的特点是形式漂亮,便于记忆。

相传这个公式最早是由古希腊数学家阿基米德得出的,而因为这个公式最早出现在海伦的著作《测地术》中,所以被称为海伦公式。中国秦九韶也得出了类似的公式,称三斜求积术。

53af96bd54694f3b93e0b5b15ab92783.png

C语言提供了一个库函数,专门用来开平发,为sqrt

8358e669c18f4b9ca1eb2b4c7bd1d890.png

#include<stdio.h>
#include<math.h>
int main()
{
  double a = 0.0;
  double b = 0.0;
  double c = 0.0;
  double circumference = 0.0;
  double area = 0.0;
  scanf("%lf %lf %lf", &a, &b, &c);
  circumference = a + b + c;
  double p = circumference / 2;
  area = sqrt(p * (p - a) * (p - b) * (p - c));
  printf("circumference=%.2lf area=%.2lf\n", circumference, area);
  return 0;
}

57eae8f6b1234aefa214836af2e6aa72.png

#include<stdio.h>
int main()
{
  double r = 0.0;//半径
  double v = 0.0;//体积
  double pi = 3.1415926;
  scanf("%lf", &r);
  v = 4.0 / 3 * pi * r * r * r;
  printf("%.3lf\n", v);
  return 0;
}

注意,输入输出,照着公式写代码就行。

这个题目,如果使用 float 来求解,答案的精度是不够的,所以试错后,使用double类型合适。

2e1314d0e84f4ef5806de3ddc78e473e.png

#include<stdio.h>
int main()
{
  int n = 0;//给的酸奶瓶数
  int h = 0;//喝一瓶酸奶的时间
  int m = 0;//总共时间
  while (scanf("%d %d %d", &n, &h, &m) != EOF)
  {
    if (m % h > 0)
    {
      printf("%d\n", n - m / h - 1);
    }
    else
    {
      printf("%d\n", n - m / h);
    }
  }
  return 0;
}

1. 注意多组输入

2. 如果h分钟喝一瓶酸奶,那么m分钟喝汽水的瓶数就是h/m瓶,但是如果m%h有余数,就说明又打开了一瓶,只是没来得及喝完,那么未打开的就少一瓶。

86ebced4984845b8a0b6c170d1afed6a.png

#include <stdio.h>
int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

885de5cfad064f53b0635079b3455539.png

#include <stdio.h>
int main()
{
    printf("Name   Age   Gender\n");
    printf("---------------------\n");
    printf("Jack   18     man\n");
    return 0;
}

25fc113be9604bf0bd0f9d119d73ff0b.png

#include <stdio.h>
int main()
{
    int arr[5]={0};
    int i=0;
    int sum=0;
    float average=0.0;
    for(i=0;i<5;i++)
    {
       scanf("%d ",&arr[i]);
       sum+=arr[i];
    }
    average=sum/5.0;
    printf("%.1f ",average);
    return 0;
}

在获取输入数据的同时,计算成绩总和,然后求出平均值,按照格式输出就行。

64ad81f517c44a508200a564c3a7332e.png

#include<stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  scanf("%x %o", &a, &b);
  int sum = a + b;
  printf("%d\n", sum);
  return 0;
}

%x是十六进制的数据格式


%o是八进制的数据格式


1. 首先要理解十进制、十六进制、八进制只是一种数据的表示形式,不是数据的存储形式。


2. 不同格式的数据的输出在C语言中有不同的格式指定,比如:%x是十六进制格式,%o就是八进制格式。


3. 不同进制的数据存放都整形变量中都是整形值,直接计算就行,计算交给计算机。

1c3cc857cabc4e16800016b8bc3974ed.png

#include<stdio.h>
int main()
{
  double price = 0.0;//价格
  int month = 0;
  int day = 0;
  int flag = 0;//是否有优惠券
  double cut = 1.0;//折扣
  double last = 0.0;
  scanf("%lf %d %d %d", &price, &month, &day, &flag);
  if (month == 11 && day == 11)
  {
    cut = 0.7;
    if (flag == 1)
    {
      last = price * cut - 50;
    }
    else
    {
      last = price * cut;
    }
  }
  else if (month == 12 && day == 12)
  {
    cut = 0.8;
    if (flag == 1)
    {
      last = price * cut - 50;
    }
    else
    {
      last = price * cut;
    }
  }
  if (last < 0.0)
  {
    printf("0.00");
  }
  else
  {
    printf("%.2lf\n", last);
  }
  return 0;
}

但是这个代码不是很好,有点代码冗余

#include <stdio.h>
int main()
{
    float price = 0.0;
    int m = 0;
    int d = 0;
    int flag = 0;
    scanf("%f %d %d %d", &price, &m, &d, &flag);
    if (m == 11 && d == 11)
    {
        price *= 0.7;
        if (flag == 1)
            price -= 50;
    }
    else if (m == 12 && d == 12)
    {
        price *= 0.8;
        if (flag == 1)
            price -= 50;
    }
    if (price < 0.0)
        price = 0.0;
    printf("%.2f\n", price);
    return 0;
}

还有一种写法,也是可以的

#include <stdio.h>
int main()
{
  float price = 0.0;
  int m = 0 ;
  int d = 0 ;
  int flag = 0 ;
  float cut = 0 ;
  scanf("%f %d %d %d",&price,&m,&d,&flag);
  if(m==11&&d==11)
  {
      cut=0.7;
  }
  else if(m == 12&&d==12)
  {
    cut=0.8;
  }
  price=price* cut- flag* 50.0;
  if(price<0.0)
      price=0.0;
  printf("%.2f\n", price);
  return 0;
}

1. 本地理解好题目意思,然后计算机就可以

2. 注意抵扣完后价格小于0,只能按照0计算

3. 按照格式输出

4f9474057b5b4348b11d2161a905bde8.png

#include <stdio.h>
int main()
{
    int i = 0;
    for(i=9999;i<=99999;i++)
    {
        int a=i/10000;
        int a1 = i%10000;
        int b=i/1000;
        int b1 = i%1000;
        int c=i/100;
        int c1 =i %100;
        int d = i/10;
        int d1=i%10;
        if((a*a1)+(b*b1)+(c*c1)+(d*d1)==i)
        {
            printf("%d ",i);
        }
    }
    return 0;
}

另外一种方法:

#include<stdio.h>
int main()
{
  int i = 0;
  for (i = 10000; i <= 99999; i++)
  {
    //判断i是否为Lily Number
    int j = 0;
    int sum = 0;
    for (j = 10; j <= 10000 ; j++)
    {
      sum += (i / j) * (i % j);
    }
    if (sum == i)
    {
      printf("%d ", i);
    }
  }
  return 0;
}

分析题目后发现,lily数求和的每一项都是对同一个数(10/100/1000...)的取模或者整除取商。

这样的话,产生10,100,1000,10000 这些数字,分别对被判断的数字取模或者取商,然后乘起来,再计算和,再判断就行。

abd993733dd34e51aeb9047d300da805.png

冒泡排序的思想是:两两相邻的元素进行比较,并且有可能的话,需要交换。小雅兰写过这个专题噢 。

冒泡排序——“C”_认真学习的小雅兰.的博客-CSDN博客

#include <stdio.h>
int main()
{
  int n = 0;
  int arr[40] = { 0 };
  scanf("%d", &n);
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }
  //排序
  //自己实现冒泡排序
  for (i = 0; i < n - 1; i++)
  {
    //一趟冒泡排序要进行多少对元素的比较
    int j = 0;
    for (j = 0; j < n - 1 - i; j++)
    {
      if (arr[i] > arr[i + 1])
      {
        int tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
  for (i = n-1 ; i >= n - 5; i--)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

当然,此题目还可以用到一个库函数——qsort

a5d13abc7e7e4283a5ed85abbf897f3d.png

34665bb853be4fd99772130d34de10a0.png

#include <stdio.h>
int cmp_int(const void* e1, const void*e2)
{
    return *(int*)e1 - *(int*)e2;
}
int main()
{
    int n = 0;
    int score[40] = {0};
    scanf("%d", &n);
    int i = 0;
    for(i=0; i<n; i++)
   {
        scanf("%d", &score[i]);
   }
    //对所有数字排序
    int j = 0;
    //使用库函数排序
    qsort(score, n, 4, cmp_int);
    for(i=0; i<5; i++)
    {
        printf("%d ", score[--n]);
    }
    return 0;
}

好啦,小雅兰今天的复习内容就到这里啦,以后还会继续复习C语言噢

6f83e40b205749fe8b864c20b8749371.jpg

相关文章
|
7月前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
5月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
7月前
|
C语言
【C语言刷题系列】删除公共元素
【C语言刷题系列】删除公共元素
|
7月前
|
存储 C语言
【C语言刷题系列】对数字添加逗号
【C语言刷题系列】对数字添加逗号
|
7月前
|
C语言
【C语言刷题系列】喝汽水问题
【C语言刷题系列】喝汽水问题
|
3月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
21 0
|
5月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
5月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
5月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
7月前
|
C语言
C语言刷题(函数)
C语言刷题(函数)