针对C语言入门OJ题
(入门)BC87-统计成绩_牛客题霸_牛客网 (nowcoder.com)
解析:
输入的同时对最大值和最小值进行求和,然后计算出最后的结果。
参考代码:
#include <stdio.h> int main() { int n = 0; double sum = 0.0; double avg = 0.0; double min = 100.0;//假设的最低分 double max = 0.0;//假设的最高分 double score = 0.0; int i = 0; scanf("%d", &n);//输入n科成绩 for(i=0; i<n; i++) { scanf("%lf", &score); sum += score; if(score > max) max = score; if(score < min) min = score; } avg = sum/n; //输出 printf("%.2lf %.2lf %.2lf\n", max, min, avg); return 0; }
(简单)BC89-密码验证_牛客题霸_牛客网 (nowcoder.com)
解析:
密码是字符串,字符串的比较函数可以使用 strcmp 函数。
参考代码:
#include <stdio.h> #include <string.h> int main() { char password1[20] = {0};//密码长度题目中没有直接说明 - 适度即可 char password2[20] = {0}; scanf("%s %s", password1, password2); //判断输入的两次密码是否一致 - 比较两个字符串 //使用库函数 - strcmp if(strcmp(password1, password2) == 0) printf("same\n"); else printf("different\n"); return 0; }
(简单)BC90-矩阵计算_牛客题霸_牛客网 (nowcoder.com)
解析:
在输入的同时,将大于 0 的数求和。
参考代码:
#include <stdio.h> int main() { int n = 0; int m = 0; scanf("%d %d", &n,&m); //获取n行m列的矩阵 int i = 0; int j = 0; int num = 0; int sum = 0;//表示和 for(i=0; i<n; i++) { for(j=0; j<m; j++) { scanf("%d", &num); if(num > 0) sum += num; } } printf("%d", sum); return 0; }
(简单)BC91-逆序输出_牛客题霸_牛客网 (nowcoder.com)
参考代码:
#include <stdio.h> int main() { int arr[10] = {0}; int i= 0 ; //输入 for(i=0; i<10; i++) { scanf("%d", &arr[i]); } //输出 - 逆序 for(i=9; i>=0; i--) { printf("%d ", arr[i]); } return 0; }
扩展:
如果这个题不仅仅是逆序输出,而是要将数组中的数据逆序存放,又如何进行处理呢?
——每一对元素进行交换,然后再从前往后进行打印。
(例:1 2 3 4 5 6 7 8 9 10 —— 将1与10 2与9 ... ... 5与6交换)
(简单)BC93-统计数据正负个数_牛客题霸_牛客网 (nowcoder.com)
参考代码:
#include <stdio.h> int main() { //接收10个数 int i = 0; int num = 0; int positive = 0;//正数个数 int negative = 0;//负数个数 for(i=0; i<10; i++) { scanf("%d", &num); if(num>=0) positive++; else negative++; } printf("positive:%d\n", positive); printf("negative:%d\n", negative); return 0; }
(简单)BC94-N个数之和_牛客题霸_牛客网 (nowcoder.com)
参考代码:
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); int i = 0; int num = 0; int sum = 0; for(i=0; i<n; i++) { scanf("%d", &num); sum += num; } printf("%d\n", sum); return 0; }
(简单)BC95-最高分与最低分之差_牛客题霸_牛客网 (nowcoder.com)
参考代码:
#include <stdio.h> int main() { int n = 0; int max = 0; int min = 100; scanf("%d", &n); int i = 0; int score = 0; for(i=0; i<n; i++) { scanf("%d", &score); if(score > max) max = score; if(score < min) min = score; } printf("%d\n", max-min); return 0; }
(简单)BC96-有序序列判断_牛客题霸_牛客网 (nowcoder.com)
解析:
题目中设置 2 个标记变量, flag1和 flag2 ,满足相邻 2 个元素升序就把 flag1 设置为 1 ,满足相邻 2 个元
素降序就把 flag2 设置为 1。 如果 flag1 和 flag2 都是 1 ,那就是乱序。
参考代码:
//代码一 #include <stdio.h> int main() { int n = 0; int arr[50] = {0}; scanf("%d", &n); int i = 0; int flag1 = 0;//升序 int flag2 = 0;//降序 for(i=0; i<n; i++) { scanf("%d", &arr[i]); if(i>0)//至少有两个元素 { if(arr[i]>arr[i-1]) flag1 = 1; else if(arr[i]<arr[i-1]) flag2 = 1; } } //flag1 和 flag2 都为1是乱序的 if(flag1+flag2 > 1) printf("unsorted\n"); else printf("sorted\n"); return 0; }
//代码二 #include <stdio.h> int main() { int n = 0; int arr[50] = {0}; scanf("%d", &n); int i = 0; int flag1 = 0;//升序 int flag2 = 0;//降序 for(i=0; i<n; i++) { scanf("%d", &arr[i]); if(i>0)//至少有两个元素 { if(arr[i]>arr[i-1]) flag1 = 1; else if(arr[i]<arr[i-1]) flag2 = 1; } } //flag1 和 flag2 都为1是乱序的 //其中一个为1,则加起来一共为1 if(flag1+flag2 == 1) printf("sorted\n"); else printf("unsorted\n"); return 0; }
(简单)BC98-序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)
解析:
需要考虑删除多个相同数字的这种情况。
参考代码:
#include <stdio.h> int main() { int n = 0; int arr[50] = {0}; int del = 0; //输入数据 scanf("%d", &n); int i = 0;//遍历数组 //读取n个数字 for(i=0; i<n; i++) { scanf("%d", &arr[i]); } //读取要删除的数字 scanf("%d", &del); //删除 int j = 0;//记录存放数据位置的下标 for(i=0; i<n; i++) { if(arr[i] != del) { arr[j++] = arr[i]; } } //此时j就是删除元素后的数据个数 for(i=0; i<j; i++) { printf("%d ", arr[i]); } return 0; }
(简单)BC99-序列中整数去重_牛客题霸_牛客网 (nowcoder.com)
参考代码:
#include <stdio.h> int main() { int n = 0; int arr[5000] = {0}; //输入数据 scanf("%d", &n); int i = 0; for(i=0; i<n; i++) { scanf("%d", &arr[i]); } //去重 for(i=0; i<n; i++) { //判断arr[i]是否在后边出现 int j = 0; for(j=i+1; j<n; j++) { //先找出相同的元素 //如果相等,要将其后续的元素往前移动 if(arr[i] == arr[j]) { //去重 - 后边的元素往前覆盖 int k = 0; for(k=j; k<n-1; k++) { arr[k] = arr[k+1]; } n--;//去重一个,个数少1 j--; //如果去重了arr[j] //把下一个位置的数字arr[j+1],放在新的arr[j]上 //恰好又和arr[i]相同,所以也要再判断 } } } for(i=0;i<n; i++) { printf("%d ", arr[i]); } return 0; }
(简单)BC100-有序序列合并_牛客题霸_牛客网 (nowcoder.com)
解析:
- 只是打印出合并后的结果,所以不需要存储。
- 先在两个数组中找较小的一个打印,等有一个数组中没有元素了,打印另外一个数组剩下的元素。
参考代码:
//代码一 #include <stdio.h> int main() { int n = 0; int m = 0; int arr1[100] = {0}; int arr2[100] = {0}; //输入n和m scanf("%d %d", &n, &m); //输入两个升序序列 int i = 0; for(i=0; i<n; i++) { scanf("%d", &arr1[i]); } for(i=0; i<m; i++) { scanf("%d", &arr2[i]); } //合并有序序列 int j = 0; i = 0; while(i<n && j<m) { if(arr1[i] < arr2[j]) { printf("%d ", arr1[i]); i++; } else { printf("%d ", arr2[j]); j++; } } if(i == n) { for(; j<m; j++) { printf("%d ", arr2[j]); } } else { for(; i<n; i++) { printf("%d ", arr1[i]); } } return 0; }
//代码二 #include <stdio.h> int main() { int n = 0; int m = 0; int arr1[100] = {0}; int arr2[100] = {0}; //输入n和m scanf("%d %d", &n, &m); //输入两个升序序列 int i = 0; for(i=0; i<n; i++) { scanf("%d", &arr1[i]); } for(i=0; i<m; i++) { scanf("%d", &arr2[i]); } //合并有序序列 int j = 0; i = 0; while(i<n && j<m) { if(arr1[i] < arr2[j]) { printf("%d ", arr1[i++]); } else { printf("%d ", arr2[j++]); } } if(i == n) { for(; j<m; j++) { printf("%d ", arr2[j]); } } else { for(; i<n; i++) { printf("%d ", arr1[i]); } } return 0; }