各位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 这些数字,分别对被判断的数字取模或者取商,然后乘起来,再计算和,再判断就行。
冒泡排序的思想是:两两相邻的元素进行比较,并且有可能的话,需要交换。小雅兰写过这个专题噢 。
#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语言噢