亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优秀的程序员。如果你有任何疑问或建议,请随时在评论区留言,让我们一起成长进步!现在,让我们开始这场知识之旅吧!
🧔🏻个人主页: FEN03
📚收入专栏: C语言
文章目录
- 📑前言
- 📗牛客网题目
- 🔖BC116 [NOIP2013]记数问题
- 🔖BC117 逆序输出
- 🔖BC118 N个数之和
- 🔖BC119 最高分与最低分之差
- 🔖BC120 争夺前五名
- 🔖BC121 有序序列合并
- 🔖BC122 有序序列判断
- 🔖BC123 有序序列插入一个整数
- 👋🏻结束语
📑前言
本文章内容主要讲解牛客网 BC116—BC123 题目详细讲解
📗牛客网题目
🔖BC116 [NOIP2013]记数问题
题目要求:
试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
例如,在1到11 中,即在1、2、3、4、5、6、7、8、9、10、11 中,数字1 出现了4 次。
输入要求:
输入共1行,包含2个整数n、x,之间用一个空格隔开。
输出描述:
输出共1行,包含一个整数,表示x出现的次数。
示例1
解答:
代码如下:
//BC116[NOIP2013]记数问题
#include<stdio.h>
int main()
{
int n = 0;
int x = 0;
int count = 0;
scanf("%d %d", &n, &x);
for (int i = 1; i <= n; i++)
{
int m = i;
while (m)
{
if (m % 10 == x)
{
count++;
}
m /= 10;
}
}
printf("%d\n", count);
return 0;
}
运行结果:
分析:
- 题目不难理解,我们只要找到 1 到 n 这个区间中,出现数字 x 的次数。
- 那么,我们需要对每一个数字的每一位进行拆分,然后再对每一个数字的每一位进行情况判断,如果情况满足,再进行一个统计即可。
🔖BC117 逆序输出
题目要求:
描述
输入10个整数,要求按输入时的逆序把这10个数打印出来。逆序输出,就是按照输入相反的顺序打印这10个数。
输入描述:
一行,输入10个整数(范围-231~231-1),用空格分隔。
输出描述:
一行,逆序输出输入的10个整数,用空格分隔。
示例1
解答:
代码如下:
//BC117 逆序输出
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
for (int i = sz - 1; i >= 0; i--)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
分析:
- 由题目,我们知道要求是按输入时的逆序把这10个数打印出来即可。
- 我们对数组10个元素进行输入时,使用 for循环,那么我们也可以写一个逆序的 for 循环,这样结果就能得到一个逆序的数组。
🔖BC118 N个数之和
题目要求:
描述
输入数字N,然后输入N个数,计算这N个数的和。
输入描述:
第一行输入一个整数N(0≤N≤50),第二行输入用空格分隔的N个整数。
输出描述:
输出为一行,为第二行输入的“N个整数之和”的计算结果。
示例1
代码如下:
//BC118 N个数之和
#include<stdio.h>
int main()
{
int n = 0;
int arr[100] = { 0 };
int sum = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
sum += arr[i];
}
printf("%d\n", sum);
return 0;
}
运行结果:
分析:
- 首先,我们创建一个变量n和一个arr数组,以及变量sum。
- 其次,这个n是控制着arr数组的输入的,数组输入我们使用for循环。
- 最后,每一次输入的值,我们对它进行加起来存放到sum即可。
🔖BC119 最高分与最低分之差
题目要求:
描述
输入n个成绩,换行输出n个成绩中最高分数和最低分数的差。
输入描述:
两行,第一行为n,表示n个成绩,不会大于10000。
第二行为n个成绩(整数表示,范围0~100),以空格隔开。
输出描述:
一行,输出n个成绩中最高分数和最低分数的差
示例1
代码如下:
//BC119 最高分与最低分之差
#include<stdio.h>
int main()
{
//创建变量和数组
int n = 0;
scanf("%d", &n);
int arr[100] = { 0 };
int max = 0;
int min = 100;
//给数组输入值
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//进行比较,打擂台
for (int i = 0; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
if (arr[i] < min)
{
min = arr[i];
}
}
printf("%d\n", max - min);
return 0;
}
运行结果:
分析:
- 首先,创建一个变量n和arr数组,以及一个max用来存放最大值和min存放最小值。
- 数组的输入我们用for循环,n来控制for循环,表示要输入几组数据。
- 其次,只需要对几组数据进行打擂台比较,也就是说,先假定第一个为最大值,然后和后面一个一个比较。 如:打擂台一致,先上一个人,有人挑战则上去,挑战成功则换人接着挑战,直至都挑战完毕为止。 如:首先先假定8位最大,然后和5比,8大,8不变; 和7比,8大,8不变; 和9比,9大,替换成9;… 直至最后一个比较即可得出最大值。
- 最后,把最大值和最小值,做差就行。
🔖BC120 争夺前五名
题目要求:
描述
期中考试开始了,大家都想取得好成绩,争夺前五名。从键盘输入 n 个学生成绩,输出每组排在前五高的成绩。
数据范围: 5≤n≤50 ,成绩采取百分制并不会出现负数
输入描述:
两行,第一行输入一个整数,表示n个学生(>=5),第二行输入n个学生成绩(整数表示,范围0~100),用空格分隔。
输出描述:
一行,输出成绩最高的前五个,用空格分隔。
示例1
代码如下:
//BC120 争夺前五名
#include<stdio.h>
void S_arr(short arr[], short n)
{
for (short i = 0; i < n; i++)
{
scanf("%hd", &arr[i]);
}
}
void b_sort(short arr[], short n)
{
for (short i = 0; i < n - 1; i++)
{
for (short j = 0; j < n - i; j++)
{
if (arr[j] < arr[j + 1])
{
short tmp = 0;
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void print_arr(short arr[])
{
for (short i = 0; i < 5; i++)
{
printf("%hd ", arr[i]);
}
}
int main()
{
unsigned short n = 0;
short arr[50] = { 0 };
scanf("%hd", &n);
//给遍历数组输入值
S_arr(arr, n);
b_sort(arr, n); //冒泡排序
print_arr(arr); //打印前5个
return 0;
}
运行结果:
分析:
- 在题目上,要求是输入n个学生的成绩,然后对学生成绩的排名前5进行输出,输出结果,我们能知道是一个高到低,是降序的排序。
- 那么,我们创建好变量n和arr数组,随后我们分装为3个函数,分别去实现。
- S_arr(arr, n); 是对数组进行输入,也就是题目要求的,输入n个学生的成绩。
- b_sort(arr, n); 是冒泡排序,是为了对学生成绩进行比较并且排序,我们已知,排序是降序的。
- print_arr(arr); 是对排序后学生成绩的打印,题目要求是打印前5个,那么我们就按照要求,控制for循环打印前5个即可
🔖BC121 有序序列合并
题目要求:
描述
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围: 1≤n,m≤1000 , 序列中的值满足 0≤𝑣𝑎𝑙≤30000
输入描述:
输入包含三行,第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
示例1
代码如下:
//BC121 有序序列合并
#include<stdio.h>
void S_arr(int arr[], int n, int m)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (int i = n; i < n + m; i++)
{
scanf("%d", &arr[i]);
}
}
void Bubbl_arr(int arr[], int n, int m)
{
for (int i = 0; i < n + m ; i++)
{
for (int j = 0; j < n + m - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void Print_arr(int arr[], int n, int m)
{
for (int i = 0; i < n + m; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int n = 0;
int m = 0;
int arr[3000] = { 0 };
scanf("%d %d", &n, &m);
S_arr(arr, n, m);
Bubbl_arr(arr, n, m);
Print_arr(arr, n, m);
return 0;
}
运行结果:
分析:
- 在题目要求上,我们能够知道。输入总共包含3行,第一行是2个整型变量的输入,第二和第三行是2个整型数组的输入,这2个变量,就控制着2个数组能够输入几组的数据。然后看结果,我们能够知道是一个升序排序。
- 对于程序的实现,我们分装为3个函数。
- S_arr(arr, n, m); 我们可以把输入的数据,输入到同一个数组中。
- Bubbl_arr(arr, n, m); 使用冒泡排序,对数组中的元素进行升序排序。
- Print_arr(arr, n, m); 对数组中的元素,进行打印 。
🔖BC122 有序序列判断
题目要求:
描述
输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。
数据范围: 3≤n≤50 序列中的值都满足 1≤val≤100
输入描述:
第一行输入一个整数N(3≤N≤50)。
第二行输入N个整数,用空格分隔N个整数。
输出描述:
输出为一行,如果序列有序输出sorted,否则输出unsorted。
示例1
代码如下:
//BC122 有序序列判断
#include<stdio.h>
void Arr_s(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
}
void Arr_sort(int arr[], int n)
{
int count1 = 0;
int count2 = 0;
for (int i = 0; i < n - 1; i++)
{
if ((arr[i] <= arr[i + 1]))
count1++;
else if ((arr[i] >= arr[i + 1]))
count2++;
}
if (count1 == n - 1 || count2 == n - 1)
printf("sorted\n");
else
printf("unsorted\n");
}
int main()
{
int n = 0;
int arr[100] = { 0 };
scanf("%d", &n);
Arr_s(arr, n);
Arr_sort(arr, n);
return 0;
}
运行结果:
分析:
- 在题目上,我们已知。无论降序还是升序都为有序;除此之外为非有序。
- 我们创建整型变量n,以及整型数组arr,我们分装为2个函数来实现程序。
- Arr_s(arr, n); 完成的是对数组进行输入数据。
- Arr_sort(arr, n); 完成的是判断数组中的元素是否为有序,那么在函数中如何去实现?
- 首先,创建2个变量,count1和count2。for循环,遍历数组中的元素。 元素进行比较如果满足升序count1++,满足降序count2++。
- 最后,进行判断。
🔖BC123 有序序列插入一个整数
题目要求:
描述
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:
第一行输入一个整数N(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出描述:
输出为一行,N+1个有序排列的整数。
示例1
代码如下:
//BC123 有序序列插入一个整数
#include<stdio.h>
void S_arr(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
}
void Bubbl_arr(int arr[], int n)
{
for (int i = 0; i < n ; i++)
{
for (int j = 0; j < n - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void Print_arr(int arr[], int n)
{
for (int i = 0; i <= n; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int n = 0;
int arr[199] = { 0 };
int arr1[1] = { 0 };
scanf("%d", &n); //输入n的值
S_arr(arr, n); //遍历数组arr输入值
scanf("%d", &arr1[0]); //输入arr1的值
arr[n] = arr1[0]; //把arr1给到arr
Bubbl_arr(arr, n); //冒泡排序
Print_arr(arr, n); //打印数组
return 0;
}
运行结果:
分析:
- 总共需要输入3行,第一行是整型变量,为了控制数组的输入;第二行是数组的输入;第三行是要插入的整型值。
- 我们主要的思路是,把要插入的值插入到数组中,并且,输出的结果是升序的,那么我们可以使用冒泡排序。
- 为了完成程序,我们分为3个函数来实现功能。
- S_arr(arr, n); 完成的是遍历数组,输入值。
- 随后,我们需要把插入的值,放到数组中。
- Bubbl_arr(arr, n); 使用冒泡排序,对数组中的值进行升序排序。
- Print_arr(arr, n); 最后,对数组中的值进行打印。
👋🏻结束语
非常感谢您花时间阅读我的博客,希望我的分享能为您带来收获。如果您对本文有任何想法或疑问,欢迎在评论区留言交流。
如果您喜欢我的博客,请继续关注,我会定期更新更多精彩内容。最后,别忘了行动起来的力量,让我们一起实践这些方法,见证自己的成长和进步!
再见,祝您生活愉快!