各位CSDN的uu们你们好呀,今天小雅兰来复习一下之前所学过的内容噢,复习的方式,那当然是刷题啦,现在,就让我们进入C语言的世界吧
当然,题目还是来源于牛客网
完完全全零基础
编程语言初学训练营_在线编程+题解_牛客题霸_牛客网
BC10 成绩输入输出
BC20 kiki算数
BC21 浮点数的个位数字
BC22 你能活多少秒
BC23 时间转换
BC24 总成绩和平均分计算
BC25 计算体重指数
BC26 计算三角形的周长和面积
BC27 计算球体的体积
BC30 KiKi和酸奶
BC31 发布信息
BC32 输出学生信息
BC33 计算平均成绩
BC34 进制A+B
BC37 网购
BC38 变种水仙花
BC39 争夺前五名
其实上次复习的时候,我们也做过这个题目,当时我们是这么来写的:
#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;
}
#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;
}
#include<stdio.h>
int main()
{
double d = 0.0;
scanf("%lf", &d);
int n = (int)d;
printf("%d\n", n % 10);
return 0;
}
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
long long second = age * 3.156e7;
printf("%lld\n", second);
return 0;
}
#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;
}
计算好对应的数字,按照格式打印就行。
#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. 按照格式打印就行。
#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;
}
要得到浮点数,要进行浮点数除法,这里就得保证 / 两端的操作数至少有一个数是浮点数。
在做这道题目的过程中,我们需要求三角形的面积,但是这道题目根本没有说它是一个什么三角形,那么这个面积该如何求呢?这就要用到海伦公式。
海伦公式又译作希伦公式、海龙公式、希罗公式、海伦-秦九韶公式。它是利用三角形的三条边的边长直接求三角形面积的公式。表达式为:S=√p(p-a)(p-b)(p-c),它的特点是形式漂亮,便于记忆。
相传这个公式最早是由古希腊数学家阿基米德得出的,而因为这个公式最早出现在海伦的著作《测地术》中,所以被称为海伦公式。中国秦九韶也得出了类似的公式,称三斜求积术。
C语言提供了一个库函数,专门用来开平发,为sqrt
#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;
}
#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类型合适。
#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有余数,就说明又打开了一瓶,只是没来得及喝完,那么未打开的就少一瓶。
#include <stdio.h>
int main()
{
printf("I lost my cellphone!\n");
return 0;
}
#include <stdio.h>
int main()
{
printf("Name Age Gender\n");
printf("---------------------\n");
printf("Jack 18 man\n");
return 0;
}
#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;
}
在获取输入数据的同时,计算成绩总和,然后求出平均值,按照格式输出就行。
#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. 不同进制的数据存放都整形变量中都是整形值,直接计算就行,计算交给计算机。
#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. 按照格式输出
#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 这些数字,分别对被判断的数字取模或者取商,然后乘起来,再计算和,再判断就行。
冒泡排序的思想是:两两相邻的元素进行比较,并且有可能的话,需要交换。小雅兰写过这个专题噢 。
冒泡排序——“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
#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语言噢