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

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

码农世界 2024-06-14 后端 119 次浏览 0个评论

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


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

🧔🏻个人主页: FEN03

📚收入专栏: C语言

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


文章目录

  • 📑前言
  • 📗牛客网题目
    • 🔖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

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


      解答:

      代码如下:

      //BC116[NOIP2013]记数问题
      #include
      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; 
      }
      

      运行结果:

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

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

      分析:

      1. 题目不难理解,我们只要找到 1 到 n 这个区间中,出现数字 x 的次数。
      2. 那么,我们需要对每一个数字的每一位进行拆分,然后再对每一个数字的每一位进行情况判断,如果情况满足,再进行一个统计即可。

      🔖BC117 逆序输出


      题目要求:

      描述

      输入10个整数,要求按输入时的逆序把这10个数打印出来。逆序输出,就是按照输入相反的顺序打印这10个数。

      输入描述:

      一行,输入10个整数(范围-231~231-1),用空格分隔。

      输出描述:

      一行,逆序输出输入的10个整数,用空格分隔。

      示例1

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


      解答:

      代码如下:

      //BC117 逆序输出 
      #include
      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; 
      }
      

      运行结果:

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

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

      分析:

      1. 由题目,我们知道要求是按输入时的逆序把这10个数打印出来即可。
      2. 我们对数组10个元素进行输入时,使用 for循环,那么我们也可以写一个逆序的 for 循环,这样结果就能得到一个逆序的数组。

      🔖BC118 N个数之和


      题目要求:

      描述

      输入数字N,然后输入N个数,计算这N个数的和。

      输入描述:

      第一行输入一个整数N(0≤N≤50),第二行输入用空格分隔的N个整数。

      输出描述:

      输出为一行,为第二行输入的“N个整数之和”的计算结果。

      示例1

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


      代码如下:

      //BC118 N个数之和 
      #include
      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;
      }
      

      运行结果:

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

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

      分析:

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

      🔖BC119 最高分与最低分之差


      题目要求:

      描述

      输入n个成绩,换行输出n个成绩中最高分数和最低分数的差。

      输入描述:

      两行,第一行为n,表示n个成绩,不会大于10000。

      第二行为n个成绩(整数表示,范围0~100),以空格隔开。

      输出描述:

      一行,输出n个成绩中最高分数和最低分数的差

      示例1

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


      代码如下:

      //BC119 最高分与最低分之差 
      #include
      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; 
      }
      

      运行结果:

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

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


      分析:

      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

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


      代码如下:

      //BC120 争夺前五名 
      #include
      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;
      }
      

      运行结果:

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

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

      分析:

      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

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


      代码如下:

      //BC121 有序序列合并 
      #include 
      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; 
      }
      

      运行结果:

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

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

      分析:

      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

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


      代码如下:

      //BC122 有序序列判断
      #include
      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; 
      }
      

      运行结果:

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

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

      分析:

      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

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


      代码如下:

      //BC123 有序序列插入一个整数 
      #include
      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; 
      }
      

      运行结果:

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

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

      分析:

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

      👋🏻结束语

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

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

      再见,祝您生活愉快!

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


转载请注明来自码农世界,本文标题:《14.《C语言》——【牛客网BC116—BC123题目讲解】》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,119人围观)参与讨论

还没有评论,来说两句吧...

Top