比较优质的题解(吧)
2025-10-31 20:13:34
发布于:吉林
虽然此题特别水,但me还是想写一篇比较优质的题解(吧)。
思路
由于题目中的 很大,暴力一定会超时,因此考虑找规律。
那么如何找规律呢?
第一种方法:列举。
列举找规律是一种很好的方法。
当你不会一道题时,列举(打表)也是一种很好的解决(骗分)方法,就例如此题,就可以这样列举:
- 当 时, 不能被 整除。
- 当 时, 能被 整除。
- 当 时, 能被 整除。
- 当 时, 不能被 整除。
- 当 时, 能被 整除。
- 当 时, 能被 整除。
其实列到这里,规律就已经很明显了:每 个数字为一个周期,其中后两个能被整除。
那么代码就很好写了。
第二种方法:理论证明。
多数时候,列举是能找到答案的。但如果你用列举讲解一道题,就有点不太恰当。
那么,我们就需要理论证明你枚举得出的规律。
学过小学奥数的都知道,如果一个数的各位数字之和能被 整除,那么它就能被 整除。
(一个数除以 的余数等于其各位数字除以 的余数)
这里就不严格证明了。
如果我们知道了这一点,就好办了。
已知有三个正整数 。
那么它们三个中:
- 第一个的各位数字之和 ;
- 前两个的各位数字之和的和 ,因为第一个数的各位数字之和除以三的余数为 ,第二个数的各位数字之和除以三的余数为 ,所以其和除以三的余数为 ;
- 同理,三个数的各位数字之和的和 。
我们假设这三个正整数中的某一个是题目中给出的序列中的某一个数的最后几位数字组成的数
(这里可能有些难以理解,简单来说就是序列里某一个数,这个数是由从1开始连续的多个正整数连接组成的。
就比如 是 连接 连接 一直连接到 形成的。
这里的“最后几位数字组成的数”就是组成这个数的所有正整数中最后的那个),
那么我们就可以把这个数按位分成 组,每组由三个连续的正整数连接组成(上面解释了),
由于前 组都是满的(三个),所以它们的数字和之和一定是 的倍数。
那么关键就是看最后一组了。
咦?
不知道你有没有发现,这里的序列中的数除以 的余数,好像和前面讲的一组中的规律很像啊!
我们设这个数是由 个连续自然数组成的,那么最后一组就有 个数
(如果最后一组也是满的的话可以当做0),
这样,我们就能得出:如果 ,那么不被 整除,否则能被 整除。
然后我们就可以得出最终式子了:
- 如果 ,那么输出为 ;
- 如果 ,那么输出为 ;
- 如果 ,那么输出为 。
其实这个也好理解,因为每一组三个数中只有一个不能被 整除,那么就有两个能被 整除。
最后一组要注意,如果只有一个数那么这个数不能被 整除;但如果有两个数那么这两个数中有一个能被 整除,要 ;
如果有三个那就没什么事了,因为前面向下取整会帮我解决问题( ^ _ ^ )。
接下来,就是最激动人心的——
代码时刻
把上述思路用代码实现,没啥难度,if判断一下 就好了。
#include<iostream>
using namespace std;
int n;//不放心的话也可以用long long,只不过这里没必要
int main(){
cin>>n;
if(n%3==0||n%3==1) cout<<n/3*2;//由于结果都一样就合并到一起了
else cout<<n/3*2+1;
}
完结撒花!
这里空空如也





有帮助,赞一个