C++ 假设今天是星期日,那么过a^b天之后是星期几?

题目

假设今天是星期日,那么过a^b天之后是星期几?

 

【输入】

两个正整数a,b,中间用单个空格隔开。0<a≤100,0<b≤10000。

 

【输出】

一个字符串,代表过a^b天之后是星期几。

 

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

 

【输入样例】

3 2000

 

【输出样例】

Tuesday

假设今天是星期日,那么过a^b天之后是星期几?

 

【输入】

两个正整数a,b,中间用单个空格隔开。0<a≤100,0<b≤10000。

 

【输出】

一个字符串,代表过a^b天之后是星期几。

 

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

 

【输入样例】

3 2000

 

【输出样例】

Tuesday

 

 

 

 

01

题目分析

    对于这道题,直观的想法是求出a^b的值,然后用这个值对7取模,就能知道是星期几了。但是注意看a和b的取值范围,a^b的值会是一个非常大的值,远超出数值的表达范围了,所以我们要用到模运算的一些性质。

 

1. 模运算的定义

    模运算是基于整除的概念,给定两个整数a和m(m不为0),a除以m的余数记作a mod m,满足关系式a = k*m + r,其中k是整数(称为商),r是满足0 <= r < m的余数。

 

2. 模运算的分配律:

(a + b) mod m = [(a mod m) + (b mod m)] mod m

(a * b) mod m=[(a mod m) * (b mod m)] mod m

 

模运算的分配律允许我们在进行乘法运算时,不必等待所有乘数相乘之后再取模,而是可以在每一步乘法之后立即取模,最终结果仍然保持一致。

 

举例说明

    假设我们要计算 3456789 × 9876543对于模100的结果,直接计算乘积将会得到一个非常大的数字,但利用模运算的分配律,我们可以分步进行:

 

    •    首先,3456789 mod 100 = 89,9876543 mod 100=43。

    •    然后,计算这两个余数的乘积:89 * 43 = 3827

    •    最后,对乘积取模:3827 mod 100 = 27;

 

因此,利用余数的这一性质,我们可以在不直接计算大数幂的情况下高效地求解(a^b) mod m的问题,这对于处理周期性问题(如本题中的星期计算)极为有用。这种方法不仅在数学上严谨,而且在计算机科学和密码学等领域有着广泛的应用。

 

 

 

 

02

代码

 

#include <iostream>#include <string>using namespace std;

int main() {    int a, b;    cin >> a >> b;        // 一周的天数    const int MOD = 7;    int result = 1;

    // 逐步计算 a^b % 7    for (int i = 0; i < b; i++) {        result *= a;        result %= MOD; // 每次对7取余,结果用于判断星期几    }        // 从Sunday开始,对应的天数    string week_days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};        // 输出结果    cout << week_days[result] << endl;        return 0;}

对于代码中,为什么可以用累乘之后再取模的方法,最后就能得到(a^b) mod 7的值,这里同学们可以自己利用分配律推演一下,比如输入的是8和2,那么两次for循环后,得到的计算结果如下:

 

(8 % 7 * 8 ) % 7 

 

根据分配律,可以进一步转化:

((8 % 7) % 7 * 8 %7 ) % 7  

 

因为 (8 % 7) % 7 其实就等于 (8 % 7),所以可以进一步转化:

( 8 % 7 * 8 %7 ) % 7

 

也就是 ( 8 * 8) % 7 ,即8^2 mod 7

 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值