文章

【GESP】C++一级练习 luogu-B2074, 计算星期几

GESP一级知识点循环和分支语句练习。又是跟星期有关的计算。题目逻辑不难,但是对数据范围的把握和处理其实有点难度,至少有个小弯子需要处理,不简单。

luogu-B2074

题目要求

题目描述

假设今天是星期日,那么过 $a$ 的 $b$ 次方天之后是星期几?

输入格式

两个正整数 $a, b$,中间用单个空格隔开。$1 \le a \le 100$,$1 \le b \le 10000$。

输出格式

一个字符串,代表过 $a$ 的 $b$ 次方天之后是星期几。

其中,Monday 是星期一,Tuesday 是星期二,Wednesday 是星期三,Thursday 是星期四,Friday 是星期五,Saturday 是星期六,Sunday 是星期日。

样例输入 #1

1
3 2000

样例输出 #1

1
Tuesday

对于 $100 \%$ 的数据,$1 \le a \le 100$,$1 \le b \le 10000$。


题目分析

  • 根据题目描述,这是一道计算星期几的问题。我们需要计算过a的b次方天之后是星期几。
  • 使用一个循环来计算a的b次方,并将结果模7以确定星期几。
  • 根据模7的结果,输出对应的星期几。

重点注意:

  • 由于 $a$ 的 $b$ 次方可能非常大,直接对 $a$ 的 $b$ 次方进行取模运算可能会导致结果不准确,因为 $a$ 的 $b$ 次方可能非常大,导致无法存储最后结果
  • 为了解决这个问题,我们可以使用取模运算的性质:$(a \cdot b) \% c = ((a \% c) \cdot (b \% c)) \% c$。
  • 我们可以在计算 $a$ 的 $b$ 次方时,每次乘法后都对结果进行取模运算,以保证结果的准确性。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <cstdio>
#include <iostream>
using namespace std; // 使用标准命名空间

int main() {
    int n; // 定义一个整数变量n,用于存储输入的整数
    cin >> n; // 从输入流中读取n的值
    int c; // 定义一个整数变量c,用于存储输入的幂次
    cin >> c; // 从输入流中读取c的值
    int mod = n % 7; // 计算n对7的余数,用于确定初始星期几
    int ans = mod; // 初始化答案为mod的值
    for (int i = 1; i < c; i++) { // 循环从1到c-1
        ans %= 7; // 对ans进行取模运算,确保结果在0到6之间
        ans *= mod; // 将ans乘以mod,模拟幂次的计算
    }
    // 根据ans的值输出对应的星期几
    if (ans % 7 == 0) {
        cout << "Sunday";
    }
    if (ans % 7 == 1) {
        cout << "Monday";
    }
    if (ans % 7 == 2) {
        cout << "Tuesday";
    }
    if (ans % 7 == 3) {
        cout << "Wednesday";
    }
    if (ans % 7 == 4) {
        cout << "Thursday";
    }
    if (ans % 7 == 5) {
        cout << "Friday";
    }
    if (ans % 7 == 6) {
        cout << "Saturday";
    }
    return 0; // 返回0,表示程序执行成功
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

本文由作者按照 CC BY 4.0 进行授权