202503-1 等差矩阵
题目描述
小 A 想构造一个 n 行 m 列的矩阵,使得矩阵的每一行与每一列均是等差数列。小 A 发现,在矩阵的第 i 行第 j 列填入整数 i \times j,得到的矩阵能满足要求。你能帮小 A 输出这个矩阵吗?
输入格式
一行,两个正整数 n, m。
输出格式
共 n 行,每行 m 个由空格分割的整数,表示小 A 需要构造的矩阵。
样例输入 1
3 4
样例输出 1
1 2 3 4
2 4 6 8
3 6 9 12
提示
对于所有测试点,保证 1\leq n,m \leq 50。
代码解析
按照题目中给出的规律打印 n 行 m 列的矩阵即可,不需要用到数组相关知识。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cout << i * j << ' ';
cout << endl;
}
return 0;
}
202503-2 时间跨越
题目描述
假设现在是 y 年 m 月 d 日 h 时而 k 小时后是 y' 年 m' 月 d' 日 h' 时,对于给定的 y, m, d, h, k,小杨想请你帮他计算出对应的 y', m', d', h' 是多少。
输入格式
输入包含五行,每行一个正整数,分别代表 y, m, d, h, k。
输出格式
输出四个正整数,代表 y', m', d', h'。
样例输入 1
2008
2
28
23
1
样例输出 1
2008 2 29 0
提示
对于全部数据,保证有 2000 \leq y \leq 3000,1 \leq m \leq 12,1 \leq d \leq 31,0 \leq h \leq 23,1 \leq k \leq 24。数据保证为合法时间。
闰年判断规则
- 普通闰年:年份能被 4 整除,但不能被 100 整除。
- 世纪闰年:年份能被 400 整除。
满足以上任意一条规则的年份就是闰年,否则是平年。
代码解析
代码看起来比较多,实际原理就是一小时一小时的去加,循环 k 次,简单的模拟这个过程即可,注意其中的小时、日、月的进位,以及大小月和闰年的判断。
#include<bits/stdc++.h>
using namespace std;
int main() {
int y, m, d, h, k, max_day;
cin >> y >> m >> d >> h >> k;
for (int i = 1; i <= k; i++) {
h++;
if (h > 23) {
h = 0;
d++;
switch (m) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
max_day = 31; break;
case 4: case 6: case 9: case 11:
max_day = 30; break;
case 2:
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
max_day = 29;
else
max_day = 28;
break;
}
if (d > max_day) {
d = 1;
m++;
if (m > 12) {
m = 1;
y++;
}
}
}
}
cout << y << ' ' << m << ' ' << d << ' ' << h;
return 0;
}
若已经学了数组的话,可以把每月的天数存到数组里,只需要单独判断二月即可,上面解法中的
switch
结构就可以不用了。
#include<bits/stdc++.h>
using namespace std;
int main() {
int y, m, d, h, k, max_day;
int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
cin >> y >> m >> d >> h >> k;
for (int i = 1; i <= k; i++) {
h++;
if (h > 23) {
h = 0;
d++;
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
day[2] = 29;
else
day[2] = 28;
if (d > day[m]) {
d = 1;
m++;
if (m > 12) {
m = 1;
y++;
}
}
}
}
cout << y << ' ' << m << ' ' << d << ' ' << h;
return 0;
}