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;
}

Copyright © 2021-2025 可见