题目集链接,非本校同学可能打不开 https://pintia.cn/problem-sets/1546142650662113280/submissions
7-1 写出这个数
分数 10
作者 xxxtentx
单位 江西财经大学
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
在这里给出一组输入。例如:
1234567890987654321123456789
输出样例:
在这里给出相应的输出。例如:
yi san wu
没什么难度
#include <algorithm>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;
int main() {
string n;
getline(cin, n);
int cnt = 0;
for (int i = 0; i < n.size(); i++) cnt += (n[i] - '0');
stack<string> st;
while (cnt) {
switch (cnt % 10) {
case 0:
st.push("ling");
break;
case 1:
st.push("yi");
break;
case 2:
st.push("er");
break;
case 3:
st.push("san");
break;
case 4:
st.push("si");
break;
case 5:
st.push("wu");
break;
case 6:
st.push("liu");
break;
case 7:
st.push("qi");
break;
case 8:
st.push("ba");
break;
case 9:
st.push("jiu");
break;
}
cnt /= 10;
}
cout << st.top();
st.pop();
while (!st.empty()) {
cout << " " << st.top();
st.pop();
}
return 0;
}
7-2 成绩排名
分数 25
作者 江太白
单位 江西财经大学
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
复习一下结构体存储数据和sort函数的用法。
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
typedef struct st {
string name, id;
int score;
} st;
bool stu_sort(st a, st b) { return a.score > b.score; }
int main() {
int n;
st stu[10010];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> stu[i].name >> stu[i].id >> stu[i].score;
}
sort(stu, stu + n, stu_sort);
cout << stu[0].name << ' ' << stu[0].id << endl;
cout << stu[n - 1].name << ' ' << stu[n - 1].id;
return 0;
}
7-3 日期类
分数 20
作者 xxxtentx
单位 江西财经大学
编写一个日期类,要求按 xxxx-xx-xx 的格式输出日期,实现加一天的操作。
输入格式:
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含 3 个用空格隔开的整数,分别表示年月日。
输出格式:
每组数据输出一行,一个结果,按 xxxx-xx-xx 的格式输出,表示输入日期的后一天的日期。
数据范围:
输入日期保证合法且不会出现闰年。
年份范围 [1000,3000]
输入样例:
在这里给出一组输入。例如:
2
1999 10 20
2001 1 31
输出样例:
在这里给出相应的输出。例如:
1999-10-21
2001-02-01
日期类问题一直是模拟题中的难点,可以参考 https://www.acwing.com/blog/content/5918/ 来进行学习
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int T;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 得到某年某月的天数
int get(int year, int month) {
if (month != 2)
return months[month];
else {
// 2月
int leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
return 28 + leap;
}
}
void next_date(int year, int month, int date) {
if (date == get(year, month)) {
if (month == 12) {
year++;
month = 1;
} else {
month++;
}
date = 1;
} else {
date++;
}
printf("%04d-%02d-%02d\n", year, month, date);
}
int main() {
cin >> T;
while (T--) {
int year, month, date;
cin >> year >> month >> date;
next_date(year, month, date);
}
return 0;
}
7-4 日期之差
分数 25
作者 江太白
单位 江西财经大学
给定两个日期,请你计算这两个日期之间有少天(定义连续的日期之差为2天)
输入格式:
共两行,每一行输入一个日期,日期格式为yyyy-MM-dd
输出格式:
一个正整数,为两个日期之间的差
输入样例:
2021-07-02
2021-07-15
输出样例:
14
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int T;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 是否是闰年
bool leap(int year) {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
// 得到某年某月的天数
int get(int year, int month) {
if (month != 2)
return months[month];
else {
// 2月
return 28 + leap(year);
}
}
int main() {
int year1, month1, date1;
int year2, month2, date2;
scanf("%d-%d-%d", &year1, &month1, &date1);
scanf("%d-%d-%d", &year2, &month2, &date2);
if (year1 == year2) {
if (month1 == month2) {
cout << abs(date2 - date1) + 1;
return 0;
} else if (month1 < month2) {
int ans = 0;
ans += get(year1, month1) - date1;
for (int i = month1 + 1; i < month2; i++) ans += get(year1, i);
ans += date2;
cout << ans + 1<< endl;
return 0;
} else if (month1 > month2) {
int ans = 0;
ans += get(year1, month2) - date2;
for (int i = month2 + 1; i < month1; i++) ans += get(year1, i);
ans += date1;
cout << ans + 1<< endl;
return 0;
}
} else if (year1 < year2) {
int ans = 0;
ans += get(year1, month1) - date1;
for (int i = month1 + 1; i <= 12; i++) ans += get(year1, i);
for (int i = year1 + 1; i < year2; i++) ans += 365 + leap(i);
for (int i = 1; i < month2; i++) ans += get(year2, i);
ans += date2;
cout << ans + 1 << endl;
} else if (year1 > year2) {
int ans = 0;
ans += get(year2, month2) - date2;
for (int i = month2 + 1; i <= 12; i++) ans += get(year2, i);
for (int i = year2 + 1; i < year1; i++) ans += 365 + leap(i);
for (int i = 1; i < month1; i++) ans += get(year1, i);
ans += date1;
cout << ans + 1 << endl;
return 0;
}
return 0;
}
7-5 数字的菱形
分数 20
作者 xxxtentx
单位 江西财经大学
打印一个由数字 0∼n 构成的菱形。
其中 n 位于正中心,数字靠近边缘时逐个递减,直至为 0。
例如,当 n=5 时,图形如下所示:
0
0 1 0
0 1 2 1 0
0 1 2 3 2 1 0
0 1 2 3 4 3 2 1 0
0 1 2 3 4 5 4 3 2 1 0
0 1 2 3 4 3 2 1 0
0 1 2 3 2 1 0
0 1 2 1 0
0 1 0
0
现在,给定 n,请你打印相应菱形。
输入格式:
一个整数 n。
输出格式:
输出相应菱形。
数据范围:
2 ≤ n ≤ 9
输入样例:
在这里给出一组输入。例如:
2
输出样例:
在这里给出相应的输出(注意每一个数字后面都有一个空格)。例如:
0
0 1 0
0 1 2 1 0
0 1 0
0
tips:第一行的0前面有4个空格,后面有5个空格
找规律的题目,规律与哈密顿距离有关(平面距离某一点的距离,就是那两个abs)
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int g[11][11];
int main() {
int n;
cin >> n;
for (int i = 0; i < 2 * n + 1; i++) {
for (int j = 0; j < 2 * n + 1; j++) {
int t = n - abs(i - n) - abs(j - n);
if (t < 0)
printf(" ");
else
printf("%d ", t);
}
puts("");
}
return 0;
}