临近期末,相信还有人因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