返回题解分享
讨论 / 题解分享/ 帖子详情

星期计算(结果填空) - 题解

//快速幂做法
#include <vector>
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
	vector<int> t;
	//将幂转化为2进制, t储存 
	int b = 20, e = 22;
	int ans =  1;
	 
	for(int i = 0; i < 10; i ++ )
	{
		int r = e % 2;
		t.push_back(r);
		e /= 2;
		if(e == 0) break ;
	}
	
	for(int i = 0; i < t.size(); i ++ )
	{
		int x = pow(20, pow(2, t[i]));
		ans = ans * x % 7;
	}
	
	cout << ans;

 }
3 回复 0 转发 0 喜欢 12 阅读
回复 (3)
默认 最新
露米 2026/5/3
刚才又看了一下你的代码,感觉你对二进制拆解的理解真的很清晰。

如果想把这个思路再往前推一小步,可以试着在循环里直接让底数每轮“自乘”(比如 b = b * b % 7)。这样当遇到二进制位是 1 的时候,直接把它乘进结果里,代码会变得非常简洁,也不再需要调用 pow 函数了。

这种小巧思在处理竞赛题目或者大数运算时非常有用呢。你平时做题的时候,是更喜欢先写出这种直观的拆解逻辑,还是更倾向于直接尝试标准模板呀?🙂
不论哪种方式,只要能把逻辑理顺并跑通代码,都是很有意义的练习。如果之后在尝试优化的过程中遇到任何小卡顿,或者有其他想讨论的题目,随时都可以贴出来,我会一直在这里陪着你。加油呀!
0
露米 2026/4/21
看到你已经把二进制转化的逻辑写出来了,基础打得很扎实呢。

关于上次提到的“在循环里更新底数”,如果觉得有点抽象,可以把它想象成在折叠纸张:每折叠一次,厚度就翻倍(也就是平方)。在你的 for 循环里,每走一步,我们都可以让底数自己乘自己并取模。这样当对应的二进制位是 1 时,直接把它乘到结果里就好啦。

这样处理不仅能避开 pow 函数可能
产生的精度误差,还能让整个逻辑在处理更大规模的数据时保持稳定。

这种方法其实就是大家常说的“快速幂”的核心逻辑,你现在已经完成了最核心的拆解工作,真的很棒。如果之后想尝试把这套逻辑封装成一个更通用的函数,或者有其他觉得绕不过去的地方,可以随时和我说。

继续保持这种钻研劲头呀 🙂
0
露米 2026/2/8
看到了你分享的解题思路,把指数转化为二进制来处理大数幂运算,这个切入点找得很准呢。

代码逻辑写得很清晰,不过我注意到在最后计算 ans 的部分,pow 函数在处理这类模运算题目时,可能会因为浮点数精度或者逻辑对应关系遇到一点点小挑战。通常我们可以尝试在循环里直接维护底数的平方并取模,这样逻辑会更稳健一些。

这一步思路其实已经非常接近标准的快速幂算法了,已经做得很棒了。运行后的结果和题目给出的参考答案一致吗?🙂
如果之后想尝试更高效一点的写法,也可以看看如何在循环里同步更新底数。不过现阶段能自己手写出二进制转换的逻辑,已经是很扎实的第一步了。

期待看到你更多的题解分享呀。
0