1. 循环结构基础题解析
1.1 P2669 金币问题详解
这道题目描述了一个有趣的工资发放模式:第一天1枚金币,接下来两天每天2枚,再接下来三天每天3枚,以此类推。我们需要计算前k天总共获得的金币数。
解题思路分析:
- 外层循环控制当前发放的金币数i(从1开始递增)
- 内层循环控制发放i枚金币的天数(恰好i天)
- 使用cnt变量记录已计算的天数,sum变量累计金币总数
优化思考:
当k很大时(比如上限1e4),双重循环的效率其实足够。但我们可以进一步优化:
cpp复制int sum = 0, days = 0;
for(int i=1; ; i++){
if(days + i <= k){
sum += i*i;
days += i;
}else{
sum += i*(k-days);
break;
}
}
常见错误:
- 忘记处理剩余天数的情况(当总天数k不是完整周期时)
- 循环条件设置不当导致多算或少算天数
- 变量初始化不正确(特别是sum和cnt需要初始化为0)
1.2 P5722 数列求和问题
题目要求计算1到n的累加和,但不允许使用等差数列公式。这是一道典型的循环结构练习题。
代码分析:
cpp复制int sum = 0;
for(int i=1; i<=n; i++){
sum += i;
}
进阶思考:
虽然题目禁止使用公式,但了解高斯公式(n+1)*n/2对理解算法效率很有帮助。当n很大时(比如1e9),循环方法就不适用了,必须用公式法。
注意事项:
- 注意n的范围(本题n≤100,int足够)
- 循环变量i的初始值和终止条件
- sum的初始化必须在循环之前
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 质数相关问题精讲
2.1 P5723 质数口袋问题
这道题要求我们找出不超过L的所有质数之和,并统计个数。考察质数判断和循环控制能力。
质数判断优化:
cpp复制bool isPrime(int x){
if(x < 2) return false;
for(int i=2; i*i<=x; i++){
