本题要求我们根据今天是星期几,推算 N 天之后是星期几。星期是一个周期为 7 的循环,当前是星期 X,过一天后变为下一天的星期,以此类推。本题中星期用数字 1∼7 表示,其中 7 代表星期日。
输入有两个整数:
输出一个整数,表示 N 天后是星期几。
我们可以把星期数看作一个循环序列:1,2,3,4,5,6,7,1,2,…
计算 N 天后的星期,等价于从 X 开始,沿着循环序列走 N 步。因为有周期性,我们只需要关心 N 被 7 除的余数。假设我们走 7 天,那么会回到原来的星期;走 8 天和走 1 天效果相同。
具体计算过程:
由于 N 可能很大,我们可以在加之前对 N 取模,即 n % 7,防止中间结果过大(虽然在本题数据范围内不必要,但这是一个好习惯)。
公式:
ans = (X - 1 + N % 7) % 7 + 1
样例 1
X=1,N=6
计算:ans = (1-1 + 6%7) % 7 + 1 = (0+6)%7+1 = 6+1 = 7
输出 7(星期日)。符合题意。
样例 2
X=5,N=3
计算:ans = (5-1 + 3%7) % 7 + 1 = (4+3)%7+1 = 0+1 = 1
输出 1(星期一)。符合题意。
该算法的时间复杂度为 O(1),无论 N 多大,计算量固定。空间复杂度也是 O(1)。
cpp1#include <stdio.h> 2 3int main() 4{ 5 int x, n; 6 scanf("%d%d", &x, &n); // 读入今天的星期和天数 7 int ans = (x - 1 + n % 7) % 7 + 1; // 计算 N 天后的星期 8 printf("%d\n", ans); 9 return 0; 10}
x - 1:将星期数映射到 0∼6 的范围,方便取模。n % 7:因为星期周期为 7,只需考虑经过天数的余数,避免数值过大。(x - 1 + n % 7) % 7:计算偏移后的结果(仍在 0∼6 内)。+ 1:将结果还原为题目要求的 1∼7 表示法。