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

发布于:2024-06-16 ⋅ 阅读:(14) ⋅ 点赞:(0)

在这里插入图片描述


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

🧔🏻个人主页: FEN03
📚收入专栏: C语言

在这里插入图片描述



📑前言

本文章内容主要讲解牛客网 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. 题目不难理解,我们只要找到 1 到 n 这个区间中,出现数字 x 的次数。
  2. 那么,我们需要对每一个数字的每一位进行拆分,然后再对每一个数字的每一位进行情况判断,如果情况满足,再进行一个统计即可。

🔖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; 
}

运行结果:

在这里插入图片描述
在这里插入图片描述
分析:

  1. 由题目,我们知道要求是按输入时的逆序把这10个数打印出来即可。
  2. 我们对数组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;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

分析:

  1. 首先,我们创建一个变量n和一个arr数组,以及变量sum。
  2. 其次,这个n是控制着arr数组的输入的,数组输入我们使用for循环。
  3. 最后,每一次输入的值,我们对它进行加起来存放到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; 
}

运行结果:

在这里插入图片描述
在这里插入图片描述


分析:

  1. 首先,创建一个变量n和arr数组,以及一个max用来存放最大值和min存放最小值。
  2. 数组的输入我们用for循环,n来控制for循环,表示要输入几组数据。
  3. 其次,只需要对几组数据进行打擂台比较,也就是说,先假定第一个为最大值,然后和后面一个一个比较。 如:打擂台一致,先上一个人,有人挑战则上去,挑战成功则换人接着挑战,直至都挑战完毕为止。 如:首先先假定8位最大,然后和5比,8大,8不变; 和7比,8大,8不变; 和9比,9大,替换成9;… 直至最后一个比较即可得出最大值。
  4. 最后,把最大值和最小值,做差就行。

🔖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;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

分析:

  1. 在题目上,要求是输入n个学生的成绩,然后对学生成绩的排名前5进行输出,输出结果,我们能知道是一个高到低,是降序的排序。
  2. 那么,我们创建好变量n和arr数组,随后我们分装为3个函数,分别去实现。
  3. S_arr(arr, n); 是对数组进行输入,也就是题目要求的,输入n个学生的成绩。
  4. b_sort(arr, n); 是冒泡排序,是为了对学生成绩进行比较并且排序,我们已知,排序是降序的。
  5. 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; 
}

运行结果:

在这里插入图片描述
在这里插入图片描述

分析:

  1. 在题目要求上,我们能够知道。输入总共包含3行,第一行是2个整型变量的输入,第二和第三行是2个整型数组的输入,这2个变量,就控制着2个数组能够输入几组的数据。然后看结果,我们能够知道是一个升序排序
  2. 对于程序的实现,我们分装为3个函数。
  3. S_arr(arr, n, m); 我们可以把输入的数据,输入到同一个数组中。
  4. Bubbl_arr(arr, n, m); 使用冒泡排序,对数组中的元素进行升序排序。
  5. 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; 
}

运行结果:

在这里插入图片描述
在这里插入图片描述

分析:

  1. 在题目上,我们已知。无论降序还是升序都为有序;除此之外为非有序。
  2. 我们创建整型变量n,以及整型数组arr,我们分装为2个函数来实现程序。
  3. Arr_s(arr, n); 完成的是对数组进行输入数据。
  4. Arr_sort(arr, n); 完成的是判断数组中的元素是否为有序,那么在函数中如何去实现?
  5. 首先,创建2个变量,count1和count2。for循环,遍历数组中的元素。 元素进行比较如果满足升序count1++,满足降序count2++。
  6. 最后,进行判断。

🔖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; 
}

运行结果:

在这里插入图片描述
在这里插入图片描述

分析:

  1. 总共需要输入3行,第一行是整型变量,为了控制数组的输入;第二行是数组的输入;第三行是要插入的整型值。
  2. 我们主要的思路是,把要插入的值插入到数组中,并且,输出的结果是升序的,那么我们可以使用冒泡排序。
  3. 为了完成程序,我们分为3个函数来实现功能。
  4. S_arr(arr, n); 完成的是遍历数组,输入值。
  5. 随后,我们需要把插入的值,放到数组中。
  6. Bubbl_arr(arr, n); 使用冒泡排序,对数组中的值进行升序排序。
  7. Print_arr(arr, n); 最后,对数组中的值进行打印。

👋🏻结束语

非常感谢您花时间阅读我的博客,希望我的分享能为您带来收获。如果您对本文有任何想法或疑问,欢迎在评论区留言交流。
如果您喜欢我的博客,请继续关注,我会定期更新更多精彩内容。最后,别忘了行动起来的力量,让我们一起实践这些方法,见证自己的成长和进步!
再见,祝您生活愉快!

在这里插入图片描述