7-1-1 你该努力了
分数 30
作者 岳金戈
单位 金陵科技学院
本学期软件工程学院,软件工程专业已经考了4次周测了,但是大部分同学成绩并不理想。那么,有些同学,你是不是该努力了。
输入格式:
以字符串形式,输入一个名字XXX。(名字皆为简写,字符串长度不超过10)
输出格式:
输出"XXX, you should study hard!"
输入样例:
在这里给出一组输入。例如:
YJG
输出样例:
在这里给出相应的输出。例如:
YJG, you should study hard!
参考答案:
cpp
#include <stdio.h>
int main (void) {
char name[15];
gets(name);
printf("%s, you should study hard!", name);
return 0;
}
7-2-1 藏头诗
分数 20
作者 张泳
单位 浙江大学
本题要求编写一个解密藏头诗的程序。
注:在 2022 年 7 月 14 日 16 点 50 分以后,该题数据修改为 UTF-8 编码。
输入格式:
输入为一首中文藏头诗,一共四句,每句一行。注意:一个汉字占三个字节。
输出格式:
取出每句的第一个汉字并连接在一起形成一个字符串并输出。同时在末尾输入一个换行符。
输入样例:
一叶轻舟向东流
帆稍轻握杨柳手
风纤碧波微起舞
顺水任从雅客流
输出样例:
一帆风顺
参考答案:
cpp
#include <stdio.h>
int main (void) {
char words[5][100];
for(int i=0; i<4; i++){
scanf("%s", words[i]);
}
for(int i=0; i<4; i++){
printf("%c%c%c", words[i][0], words[i][1], words[i][2]);
}
return 0;
}
7-2-2 藏尾诗
分数 20
作者 C课程组
单位 浙江大学
本题要求编写一个解密藏尾诗的程序。
注:在 2023 年 1 月 17 日 15 点 14 分以后,该题数据修改为 UTF-8 编码。
输入格式:
输入为一首中文藏尾诗,一共四句。每句一行,但句子不一定是等长的,最短一个汉字,最长九个汉字。注意:一个汉字占三个字节。
输出格式:
取出每句的最后一个汉字并连接在一起形成一个字符串并输出。同时在末尾输入一个换行符。
输入样例:
悠悠田园风
然而心难平
兰花轻涌浪
兰香愈幽静
输出样例:
风平浪静
参考答案:
cpp
#include <stdio.h>
int main (void) {
char words[4][100];
for(int i=0; i<4; i++){
scanf("%s", words[i]);
}
for(int i=0; i<4; i++){
int len = strlen(words[i]);
printf("%c%c%c", words[i][len-3], words[i][len-2], words[i][len-1]);
}
return 0;
}
7-3-1 字符串替换
分数 20
作者 C课程组
单位 浙江大学
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
| 原字母 | 对应字母 |
|---|---|
| A | Z |
| B | Y |
| C | X |
| D | W |
| ... | ... |
| X | C |
| Y | B |
| Z | A |
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
参考答案:
cpp
#include <stdio.h>
int main (void) {
char str[100];
gets(str);
for(int i = 0; i < strlen(str); i++){
if(str[i] >= 'A' && str[i] <= 'Z'){
str[i] = 'A' + 'Z' - str[i];
}
}
puts(str);
return 0;
}
7-3-2 字符串查找
分数 20
作者 郭奇展
单位 金陵科技学院
给定两个字符串A和B,请判断B是否是A的子串。如果是,输出B在A中第一次出现的位置(从0开始计数),否则输出-1.
输入格式:
给定两行输入:
第一行输入字符串A
第二行输入字符串B
两字符串的长度都不超过 10000,并且保证每个字符串都是由可见的ASCII码和空白字符组成。
输出格式:
输出一个整数,表示字符串B在字符串A中首次出现的位置或者-1
输入样例:
在这里给出一组输入。例如:
Hello World!
ll
输出样例:
在这里给出相应的输出。例如:
2
参考答案:
cpp
#include <stdio.h>
#include <string.h>
int main (void) {
char A[10000], B[10000];
gets(A);
gets(B);
int lenA = strlen(A), lenB = strlen(B);
for(int i = 0; i <= lenA - lenB; i++){
int index = 0;
for(index = 0; index < lenB; index++){
if(A[i + index] != B[index]){
break;
}
}
if(index == lenB){
printf("%d", i);
return 0;
}
}
printf("-1");
return 0;
}
7-4-1 猴子选大王
分数 15
作者 徐镜春
单位 浙江大学
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
参考答案:
cpp
#include <stdio.h>
int main (void) {
int n;
scanf("%d", &n);
int monkey[1005] = {0}, count = 0, cnt = 0;
while(1){
for(int i = 0; i < n; i++){
if(monkey[i] == 0){
cnt++;
}
if(cnt == 3){
monkey[i] = 1;
count++;
cnt = 0;
}
}
if(count == n-1){
for(int i = 0; i < n; i++){
if(monkey[i] == 0){
printf("%d", i + 1);
return 0;
}
}
}
}
return 0;
}
7-4-2 约瑟夫问题
分数 15
作者 孙振晢
单位 上海大学
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式:
输入两个整数 n,m。
输出格式:
输出一行 n 个整数,按顺序输出每个出圈人的编号。
说明/提示
1<=n,m<=100
输入样例:
10 3
输出样例:
3 6 9 2 7 1 8 5 10 4
参考答案:
cpp
#include <stdio.h>
int main (void) {
int n, m;;
scanf("%d %d", &n, &m);
int flag[105] = {0};
int count, cnt;
count = cnt = 0;
// cnt : 表示报数
// count : 表示总出圈人数
while(1){
for(int i = 0; i < n; i++){
// flag[i] = 0, 表示未出圈的人
if(flag[i] == 0){
// 报数
cnt++;
}
// 报数报到 m 的人出圈
if(cnt == m){
// flag[i] = 1, 标记该人出圈
flag[i] = 1;
// 报数清零
cnt = 0;
// 总出圈人数++
count++;
printf("%d ", i+1);
}
}
// 还剩最后一个人
if(count == n-1){
// for循环遍历flag数组 找到未出圈(flag[i]=0)的人
for(int j = 0; j < n; j++){
if(flag[j] == 0){
// 输出
printf("%d", j+1);
return 0;
}
}
}
}
return 0;
}
7-5-1 感染人数
分数 15
作者 黄龙军
单位 绍兴文理学院
设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?
输入格式:
第一行输入两个整数n,m(1<n≤20,1≤m≤100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@表示当天该房间住着得流感的人,.表示该房间住着健康的人,#表示该房间是空的。
输出格式:
输出一个整数,表示第m天得了流感的人数。
输入样例1:
5 3
#....
.....
...##
.#.@.
@.#..
输出样例1:
10
输入样例2:
5 4
....#
.#.@.
.#@..
#....
.....
输出样例2:
16
参考答案:
cpp
#include <stdio.h>
int main (void) {
int n, m;
scanf("%d %d", &n, &m);
getchar();
char map[25][25];
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
scanf("%c", &map[i][j]);
}
getchar();
}
int total = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(map[i][j] == '@'){
total++;
}
}
}
for(int day = 1; day < m; day++){
for(int i = 1; i <= n; i++){
for(int j = 1; j<= n; j++){
if(map[i][j] == '.'){
if(map[i+1][j] == '@' || map[i-1][j] == '@' ||
map[i][j+1] == '@' || map[i][j-1] == '@'){
map[i][j] = '*';
total++;
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (map[i][j] == '*') {
map[i][j] = '@';
}
}
}
}
printf("%d", total);
return 0;
}