14.《C语言》——【牛客网BC116—BC123题目讲解】

FEN03 2024-07-23 09:35:10 阅读 53


在这里插入图片描述


亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优秀的程序员。如果你有任何疑问或建议,请随时在评论区留言,让我们一起成长进步!现在,让我们开始这场知识之旅吧!

🧔🏻个人主页: 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

在这里插入图片描述


解答:

代码如下:

<code>//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

在这里插入图片描述


解答:

代码如下:

<code>//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

在这里插入图片描述


代码如下:

<code>//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

在这里插入图片描述


代码如下:

<code>//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

在这里插入图片描述


代码如下:

<code>//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

在这里插入图片描述


代码如下:

<code>//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

在这里插入图片描述


代码如下:

<code>//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

在这里插入图片描述


代码如下:

<code>//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); 最后,对数组中的值进行打印。


👋🏻结束语

非常感谢您花时间阅读我的博客,希望我的分享能为您带来收获。如果您对本文有任何想法或疑问,欢迎在评论区留言交流。

如果您喜欢我的博客,请继续关注,我会定期更新更多精彩内容。最后,别忘了行动起来的力量,让我们一起实践这些方法,见证自己的成长和进步!

再见,祝您生活愉快!

在这里插入图片描述




声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。