首页 > 其他分享 >CSU中南大学OJ平台2024级C语言期末复习

CSU中南大学OJ平台2024级C语言期末复习

时间:2024-12-30 22:25:58浏览次数:3  
标签:输出 OJ 中南大学 ++ 样例 C语言 int fruit printf

       临近期末,相信还有人因OJ平台没做出来而发愁。 没事的孩子们,我给你们带来了法宝,解题思路和代码。

奇偶数

做风车

七夕节

消消乐

水果店

问题 V: 奇偶数(20分)

题目描述

小南在网上看到了一个关于奇偶数的定义:如果一个正整数n既能拆成两个奇数之和也能拆成两个偶数之和(这些奇数和偶数都是正整数),则n称为奇偶数。 他想编写一个程序判断某个正整数是否为奇偶数,请聪明的你帮他完成。

输入

多个样例。 每个样例输入一个正整数n(1≤n≤105)。

输出

每个样例输出一个结果,如果n是奇偶数,则输出Yes,否则输出No。 每个样例输出结果占一行。

样例输入 Copy
10
105
200
2111
样例输出 Copy
Yes
No
Yes
No
#include<stdio.h>

int main()
{
	int n;
	
	while(~scanf("%d" , &n)){
		if(n % 2 == 0 && n > 2)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

        孩子们,2是偶数但是不能同时拆成两个正偶数,所以要与其他偶数分开讨论。

问题 W: 做风车(20分)

题目描述

每年的春天,小南班上都会组织玩风车的活动。 这次老师给了小南一个任务,就是打印大小不同的风车。 这些风车由字母组成,大小由n决定。 你能根据老师给出的n,帮小南编写程序打印出相应的风车吗?

输入

多个样例。 每个样例输入一个正整数n(1≤n≤26)。

输出

每个样例输出一个对应的风车图形。 每个样例输出结果之间空一行。

样例输入 Copy

1

2

3

样例输出 Copy
a
 a
aba
 a
  a
 ab
abcba
  ba
  a
#include<stdio.h>

void Paint(int x);

int main()
{
	int n;
	
	while(~scanf("%d" , &n)){
		Paint(n);
	}
	
	return 0;
}

void Paint(int x){
	char ch;
	int n, m, k, i;
	n = x - 1;
	k = x - 1;
	m = 1;
	while(n){		//打印风车上半部分
		for(i = 0;i < n;i ++)
			printf(" ");
		for(i = 0,ch = 'a';i < m;i ++){
			printf("%c" , ch ++);
		}
		printf("\n");
		n --;
		m ++;
	}
	
	for(i = 0,ch = 'a';i < x;i ++)	//打印风车中间部分
		printf("%c" , ch ++);
		ch -= 1;
	for(i = x - 1;i > 0;i --)
		printf("%c" , -- ch);
	printf("\n");
	
	while(k){		//打印风车下半部分
		for(i = 0;i < x - 1;i ++)
			printf(" ");
		for(i = 0,ch = 'a' + k - 1;i < k;i ++)
			printf("%c" , ch --);
		printf("\n");
		k --;
	}
	printf("\n");
}

        孩子们,对称图形是很美的,要分模块完成。

问题 X: 七夕节(20分)

题目描述

七夕节,又称为“乞巧节”或“女儿节”,是中国传统节日之一,流行于甘肃省西和县,属于国家级非物质文化遗产。 七夕节到了,小南策划了一个活动,就是每个女生可以从一个箱子里抽取一个正整数n,n的长度不超过1000位。 如果n中7的个数超过一半或者n的数字之和包含因子7,则该女生可以获得一个礼物。 请你编写程序实现:根据女生得到的n,判断她能否得到礼物。

输入

多个样例。 每个样例输入一个正整数n,n的长度不超过1000位。

输出

每个样例输出一个结果,如果n满足条件,则输出Yes,否则输出No。 每个样例输出结果占一行。

样例输入 复制

7
123
124
776
6677
7777777777
样例输出 Copy
Yes
No
Yes
Yes
No
Yes
#include<stdio.h>
#include<string.h>
#define MAX 1001

int Seven(char a[], int x){			//找出位数和sum中是否含有因子7
	for(int i = 0;i < x;i ++)
		if(a[i] == '7')
			return 1;
	return 0;
}

int main()
{
	char a[MAX], b[MAX], *p;
	int la, lb, n, sum;
	
	while(~scanf("%s" , a)){
		la = strlen(a);
		for(p = a,n = 0,sum = 0;p < a + la;p ++){	//统计因子7的个数
			sum += *p - '0';
			if(*p == '7')
				n ++;
		}
		
		sprintf(b, "%d", sum);		//将整数转换为字符串的函数
		if(n > la/2 || Seven(b, lb) || sum % 7 == 0)	//位数和sum中能整除7也是一个条件
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

        孩子们,七夕节没男女朋友的就还是老老实实写OJ吧。

问题 Y: 消消乐(20分)

题目描述

消消乐是一种深受大众欢迎的游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。

说明:一个棋子可能在某一行和某一列同时被消除;每一行或每一列首尾的棋子不属于连续的。

小南的任务:给定一个n行m列(1≤n,m≤ 50)的棋盘,棋盘中的每一个方格上有一个棋子,编程序输出经过一次消除后的棋盘。你能帮他实现吗?

输入

多个样例。每个样例输入包含1+n行:

第1行输入两个用空格分开的正整数n(1≤n≤50)和m(1≤m≤50),分别表示棋盘的行数和列数。

        接下来有n行,每行m个用空格分隔的正整数x(1≤x≤9),分别表示每一个方格中的棋子的颜色。

输出

对于每个样例,输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号,行末没有多余的空格。每个样例输出结果之间空一行。

样例输入 Copy

4 5
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
样例输出 Copy
2 2 3 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4

2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
#include<stdio.h> // 80%正确
#define R 50 
#define	C 50

int main()
{
	int a[R][C], b[R][C], n, m, i, j, k, c;
	
	while(~scanf("%d %d" , &n, &m)){
		for(i = 0;i < n;i ++)
			for(j = 0;j < m;j ++)
				scanf("%d" , &a[i][j]);
	
	if(n <= 2 && m <= 2){		//对行和列都小于3的矩阵单独讨论
		for(i = 0;i < n;i ++){
			for(j = 0;j < m;j ++){
				printf("%d" , a[i][j]);
				if(j < m - 1)
					printf(" ");
			}
			printf("\n");
		}	
		printf("\n");
	}
	
	else{
		for(i = 0;i < n;i ++)
			for(j = 0;j < m;j ++)
				b[i][j] = a[i][j];		//新建一个和原矩阵相同的矩阵
		
		for(i = 0,c = 0;i < n;i ++){	//对原矩阵消除行
			for(j = 1;j < m - 1;j ++){
				if(a[i][j-1] == a[i][j] && a[i][j] == a[i][j+1]){
					c = a[i][j];
					a[i][j-1] = 0; a[i][j] = 0; a[i][j+1] = 0;
					for(k = j+2;k < m;k ++){	//对行中3个及以上相同的数字消除,直到遇到不同数字为止
						if(a[i][k] == c)
							a[i][k] = 0;
						else
							break;
					}
				}
			}
		}
		
		for(j = 0,c = 0;j < m;j ++){	//对新矩阵消除列
			for(i = 1;i < n - 1;i ++){
				if(b[i-1][j] == b[i][j] && b[i][j] == b[i+1][j]){
					c = b[i][j];
					b[i-1][j] = 0; b[i][j] = 0; b[i+1][j] = 0;
					for(k = i+2;k < m;k ++){	//对列中3个及以上相同的数字消除,直到遇到不同数字为止
						if(b[k][j] == c)
							b[k][j] = 0;
						else
							break;
					}
				}
			}		
		}
		
		for(i = 0;i < n;i ++){		//将新矩阵中被消除的数在原矩阵中也消除
			for(j = 0;j < m;j ++){
				if(a[i][j] != 0 && b[i][j] == 0)
					a[i][j] = 0;
			}
		}
		
		for(i = 0;i < n;i ++){
			for(j = 0;j < m;j ++){
				printf("%d" , a[i][j]);
				if(j < m - 1)
					printf(" ");
			}	
			printf("\n");
		}
		printf("\n");	
	}
	
	}		
	return 0;
}

        孩子们,如果这么做只会对80%,剩下的错误比较难找。所以对矩阵的列处理我还有更好的方法。

        

#include<stdio.h>
#define R 50 
#define	C 50

int main()
{
	int a[R][C], b[R][C], d[R], h[R], n, m, i, j, k, c;
	
	while(~scanf("%d %d" , &n, &m)){
		for(i = 0;i < n;i ++)
			for(j = 0;j < m;j ++)
				scanf("%d" , &a[i][j]);
	
	if(n <= 2 && m <= 2){
		for(i = 0;i < n;i ++){
			for(j = 0;j < m;j ++){
				printf("%d" , a[i][j]);
				if(j < m - 1)
					printf(" ");
			}
			printf("\n");
		}	
		printf("\n");
	}
	
	else{
		for(i = 0;i < n;i ++)
			for(j = 0;j < m;j ++)
				b[i][j] = a[i][j];
		
		for(i = 0,c = 0;i < n;i ++){
			for(j = 1;j < m - 1;j ++){
				if(a[i][j-1] == a[i][j] && a[i][j] == a[i][j+1]){
					c = a[i][j];
					a[i][j-1] = 0; a[i][j] = 0; a[i][j+1] = 0;
					for(k = j+2;k < m;k ++){
						if(a[i][k] == c)
							a[i][k] = 0;
						else
							break;
					}
				}
			}
		}
		
		for(j = 0;j < m;j ++){		//声明一个新的一维比较数组,存储每一列第一个值
			d[j] = b[0][j];
			h[j] = 1;
		}
		for(i = 1;i < n;i ++){		//一行一行检索,如果该行与比较数组的值不同,更新比较数组的值
			for(j = 0;j < m;j ++){
				if(b[i][j] != d[j]){
					d[j] = b[i][j];
					h[j] = 1;
				}
				else
					h[j] ++;		//与比较数组的值相同的行数有连续3行及以上,消除
					
				if(h[j] >= 3){
					b[i][j] = 0;
					b[i-1][j] = 0;
					b[i-2][j] = 0;
				}
			}
		}
		
		for(i = 0;i < n;i ++){
			for(j = 0;j < m;j ++){
				if(a[i][j] != 0 && b[i][j] == 0)
					a[i][j] = 0;
			}
		}
		
		for(i = 0;i < n;i ++){
			for(j = 0;j < m;j ++){
				printf("%d" , a[i][j]);
				if(j < m - 1)
					printf(" ");
			}	
			printf("\n");
		}
		printf("\n");	
	}
	
	}		
	return 0;
}

        孩子们,方法大同小异,只是对列处理逻辑更加严谨,不会出现奇奇怪怪的错误。

问题 Z: 水果店(10分)

题目描述

小南经常会出现在信息楼,他发现信息楼附近并没有水果店,所以决定开一家水果店。但是现在水果店的销售明细表的制作就难住他了。他想请聪明的你帮忙制作一下水果店的明细表,明细表中的水果按产地分类。

输入

多个样例。每个样例输入包含1+n行:

第1行输入一个日期(2020年以来)和一个正整数n(1≤n≤100),表示交易日期和交易次数。

接下来有n行数据,每行表示一次交易,由水果名称(小写字母组成,长度满足1≤len(水果)≤80)、水果产地(小写字母组成,长度满足1≤len(产地)≤80)和交易的水果数目(满足int类型)组成。

输出

对于每个样例,输出一份正确格式的明细表。明细表的第一行是交易日期,第二行是产地名,接下来的若干行包括水果名和数量,具体见样例输出。输出时按照水果产地和水果的字母序升序排列。

样例输入 Copy

2022/12/18 5
apple changsha 3
apple beijing 1
pear beijing 1
apple beijing 3
apple beijing 1
2023/01/01 5
apple beijing 3
banana beijing 7
pear changsha 1
pear nanjing 10
apple changsha 5
样例输出 Copy

2022.12.18
beijing
|----apple(5)
|----pear(1)
changsha
|----apple(3)
2023.01.01
beijing
|----apple(3)
|----banana(7)
changsha
|----apple(5)
|----pear(1)
nanjing
|----pear(10)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define L 81
#define N 100

struct Fruits{
	char name[L];
	char area[L];
	int n;
};

struct Fruits fruit[N];


int main()
{
	int y, m, d, n, i, j, sum;
	while(~scanf("%d/%d/%d %d" , &y, &m, &d, &n)){
		for(i = 0;i < n;i ++)
			scanf("%s %s %d" , &fruit[i].name, &fruit[i].area, &fruit[i].n);
		
		for(i = 0;i < n;i ++){		//归类相同地区的水果,并按地区名字排序
			for(j = 1;j < n - i;j ++){
				if(strcmp(fruit[j-1].area, fruit[j].area) > 0){
					struct Fruits t;
					t = fruit[j-1];
					fruit[j-1] = fruit[j];
					fruit[j] = t;
				}
			}
		}
		
		for(i = 0;i < n;i ++){		//在相同地区的水果中,按照水果名字排序
			for(j = 1;j < n - i;j ++){
				if(strcmp(fruit[j-1].area, fruit[j].area) == 0){
					if(strcmp(fruit[j-1].name, fruit[j].name) > 0){
						struct Fruits t;
						t = fruit[j-1];
						fruit[j-1] = fruit[j];
						fruit[j] = t;
					}
				}
			}
		}
		
		for(i = 1;i < n;i ++){		//统计相同地区的相同水果的数量,求和
			if(strcmp(fruit[i-1].area, fruit[i].area) == 0 && strcmp(fruit[i-1].name, fruit[i].name) == 0){
				fruit[i].n += fruit[i-1].n;
				fruit[i-1].n = 0;
				for(j = i + 1;j < n;j ++){
					if(strcmp(fruit[j].area, fruit[j-1].area) != 0 || strcmp(fruit[j-1].name, fruit[j].name) != 0)	
						break;
					fruit[j].n += fruit[j-1].n;
					fruit[j-1].n = 0;
				}
			}
		}
		
		printf("%d.%02d.%02d\n" , y, m, d);
		char ch[L] = { '0' };
		for(i = 0;i < n;i ++){
			if(fruit[i].n != 0){
				if(strcmp(fruit[i].area, ch) != 0){
					printf("%s\n" , fruit[i].area);
					strcpy(ch, fruit[i].area);
				}				
				printf("|----%s(%d)\n" , fruit[i].name, fruit[i].n);
			}
		}
	}
	return 0;
}

        孩子们,这题需要用结构变量,虽然长,但是一步一步慢慢来,注意每一步处理的逻辑和细节,大任务划分为小任务,你一定可以做对的。Man!

标签:输出,OJ,中南大学,++,样例,C语言,int,fruit,printf
From: https://blog.csdn.net/2401_87217723/article/details/144761546

相关文章

  • C语言中的右左法则
    C语言中的右左法则C语言中的右左法则是一种阅读复杂声明(如指针、数组、函数等)的方法,用于帮助理解变量或函数的类型。右左法则通过从标识符(变量名)开始,依次向右和向左查看修饰符来解析声明的含义。右左法则的基本规则从标识符(变量名)开始:找到变量名,作为解析的起点。优先处......
  • C语言:固定格式数组输出
    我想实现输入一个数组n(数组a的个数)然后输入数组a(用逗号分隔的输入),然后再输入m(数组b个数)再输入数组b1.输入inta[max],b[max];inti=0,j=0,n,m;//读取数组a的个数scanf("%d",&n);for(i=0;i<n;i++){if(scanf("%d,",&a......
  • Proj CJI Paper Reading: OffsetBias: Leveraging Debiased Data for Tuning Evaluato
    目的:reducebiasofLLMsMethod:使用GPT4生成off-topic(完全无关的话题)用GPT3.5生成遵照off-topic回答的badresponse用goodresponse,badresponse来微调模型,减少bias注意:这里off-topic不会作为用于防止注入的dataAbstract5.......
  • 【C语言练习(19)—加强对指针练习】
    C语言练习(19)文章目录C语言练习(19)前言问题问题解析总结前言主要练习如何使用指针,进一步加深对指针使用。问题有n个数,将前面的m个数拿出来,放到最后面,剩余的数一次向前移动m个位置。问题解析创建一个数组,并求出这个数组的长度,把数组打印出来intarr[10]={0};......
  • XDOJ 730 一元稀疏多项式的简单计算器 (Copilot 辅助代码)
    标题 一元稀疏多项式计算器时间限制2S内存限制10000 Kb问题描述设计一个一元稀疏多项式的简单计算器,要求能进行加减运算。问题输入每组数据有3行构成,第1行为3个正整数n,m,t,n表示第一个多项式的项数,m表示第二个多项式的项数,t表示运算类型,0为加法,1为减法,每组数据......
  • [BZOJ3230] 相似子串 题解
    \(\text{[BZOJ3230]相似子串题解}\)巧妙地利用了后缀数组的一些奇妙性质。先考虑第一问。首先去处理本质不同的子串这个东西。这个东西我们显然是见过的,于是套路地建出SA求出\(\operatorname{height}\)数组。每一个子串对应的都是一个后缀的前缀。由于串都是本质不同的,那......
  • GXUOJ-算法-第四次作业
    1.圆排列问题描述GXUOJ|圆排列代码解答#include<bits/stdc++.h>usingnamespacestd;intn;intr[1000];doublecalculate(intr[],intn,doubleminL){ doublex,y; doublesum=0; for(inti=0;i<n;i++){ intx,y; x=r[i];y=r[i+1]; //sum+=sqrt((x+y)*(......
  • 力扣刷题:单链表OJ篇(下)
    大家好,这里是小编的博客频道小编的博客:就爱学编程很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!目录1.环形链表(1)题目描述(2)解题思路(3)复杂度分析2.环形链表2(1)题目描述(2)解题思路(3)复杂度分析快乐的时光总是短暂,咱们下篇博文再见啦......
  • 详解C语言队列
    队列一、队列的基本概念二、实现队列的常用方法1.基于数组实现队列定义队列结构初始化队列判断队列是否为空判断队列是否已满入队操作(Enqueue)出队操作(Dequeue)获取队头元素(Peek/Front)2.基于链表实现队列定义链表节点和队列结构初始化队列判断队列是否为空入队操作(Enq......
  • [BZOJ2839] 集合计数
    思路直接计算不好计算,套路的,考虑「至少」「至多」来转化容易发现你「钦定」\(k\)个元素在交集之中,也就是说交集大小「至少」为\(k\),怎么处理这个的方案数,其实比较容易可以发现,这个的方案数为\[f(k)={n\choosek}\sum_{i=0}^{n-k}2^i\]不够优,考虑转......