关于循环的一些总结

**不要局限于传统的for循环形式,即(for int i=0;i<n;i++) **
1.当题目要求枚举很多种情况时,可以用所见的方式让运行时间更短,参见洛谷P1217 Prime Palindromes. [a,b]是5到1亿之间的数,要找到所有的回文质数看起来要枚举1亿次,但其实我们可以将例如1234321的数构造得出。比如,先得出1234,再复制一下。当然,假设各数位为d1,d2,d3,d4, 则1234321 可以这样写:
for(int d1=1;d1<=9;d1+=2){
for(d2=1;d2<=9;d2++){

for(d3=1;d3<=9;d3++){
for(int d4=1;d4<=9;d4++){

int num=1000000*d1+100000*d2+10000*d3+1000*d4+100*d3+10*d2+d1;}

2.不要局限于传统的for循环,就是for(int i=0;i<n;i++)
其实这样会局限我们的思维。有的时候,因为题目的要求,我们可以这样写
for(int i=0;;i++)
参考洛谷P2669
因为我们不知道到底循环多少天,可以在循环里面判断,最后当符号题目时,break;

3.一些小启发:B2075 幂的末尾
本来的思路:1.先算出来a的b次方
-如果a的b次方小于10,直接输出两个0和a的b次方
2.将结果转成字符串
3.用s.substr(),从倒数第三个字符开始截,截到最后一个
4.输出
有点小麻烦,代码贴这里:

#include <string>
int n=1234567
string s = to_string(1234567); // 将int型1234567直接变成字符串1234567

常规方法:声明变量t=1
用for循环遍历,每次乘以a,结果保存到t
每一次让t%1000,取到最后三位。(为什么是%1000?因为%1000的结果是0~999,这样确保是三位数)
输出(不够三位补前导0)

posted @ 2025-03-08 14:28  polyoid  阅读(39)  评论(0)    收藏  举报