C++信奥洛谷循环章节练习题

📚 C++ 算法基础笔记 (Day 424)

P2669 NOIP 2015 普及组 金币

🏷️ 核心考点: 嵌套循环、累加器、找规律

题目大意: 骑士第1天拿1枚金币,第2-3天每天拿2枚,第4-6天每天拿3枚......以此类推。求前 k 天总共拿了多少金币。

解题思路:

外层循环控制天数,从第1天循环到第 k 天。

内层逻辑控制每天发多少金币。我们可以发现,发 i 枚金币会持续 i 天。

使用一个变量记录当前应该发的金币数,另一个变量记录该数量还需要发几天。

C++ 关键点:

变量初始化: 累加金币的变量 sum 必须初始化为 0。

循环控制: 注意循环的终止条件,不要超出总天数 k。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int k,total=0,coins=1,days=0;
	cin>>k; 
	for(int i=1;i<=k;i++){
		total+=coins;
		days++;//这个阶段又多了一天
		if(days==coins){
			//如果这个阶段发完了
			coins++;
			days=0; 
		} 
	}
	cout<<total;
    return 0;
}

P1423 小玉在游泳

🏷️ 核心考点: while 循环、浮点数运算、精度问题

题目大意: 小玉第一步游 2 米,之后每一步都是上一步的 98%。问游够 s 米至少需要几步?

解题思路:

这是一个典型的"直到型"循环问题。

使用 while 循环,只要总距离小于目标距离 s,就继续游。

每次循环中:步数+1,当前步长 times 0.98,总距离累加。

C++ 关键点:

数据类型: 距离和小数步长必须使用 double 或 float,不能用 int。

循环条件: 注意是 < 还是 <=,题目通常要求"达到或超过",所以循环条件通常是 total < s。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    double s,m=2,total=0;
    int c=0;
    cin>>s;
    while(s>total){
    	total+=m;
    	m*=0.98;
    	c++;
	}
    cout<<c;
    return 0;
}

P1307 NOIP 2011 普及组 数字反转

🏷️ 核心考点: 取模运算 %、整除 /、前导零处理

题目大意: 给定一个整数,将其反转(例如 123 变 321,-380 变 -83)。

解题思路:

方法一(数学法):

判断正负号。

通过 n % 10 取出最后一位,n / 10 去掉最后一位。

利用 ans = ans * 10 + digit 构建反转后的数字。

方法二(字符串法): 将数字作为字符串读入,倒序遍历输出。

C++ 关键点:

前导零: 如果输入是 1200,反转后是 0021,输出应为 21。数学法自动解决了这个问题,字符串法需要手动跳过开头的 '0'。

负数处理: 记得先输出负号,再处理数字部分。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
	int n,r=0,m=0;
	cin>>n;
	bool t=false;
	if(n<0){
		n=-n;
		t=true;
	}
	while(n!=0){
		r=n%10;//123
		m=m*10+r;//30+2--320+1
		n/=10;
	}
	if(t){
		m=-m;
	}
	cout<<m;
    return 0;
}

P1420 最长连号

🏷️ 核心考点: 数组遍历、计数器重置、打擂台算法

题目大意: 在 n 个整数中,找出数值连续递增(相差为1)的最长片段长度。

解题思路:

定义两个变量:current_len(当前连号长度)和 max_len(最大连号长度)。

从第2个数开始遍历,如果 ai == ai-1 + 1,说明连上了,current_len++。

否则,说明断了,比较并更新 max_len,然后将 current_len 重置为 1。

注意: 循环结束后,还要再比较一次 max_len 和 current_len(防止最长连号出现在数组末尾)。

C++ 关键点:

初始化: max_len 至少为 1(因为单个数字也是长度为1的连号)。

边界检查: 循环结束后别忘了最后一次更新最大值。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,a[10005];

int main() {
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];	
	}
	int ans=1,c=1;
	for(int i=1;i<n;i++){
		if(a[i]==a[i-1]+1) c++;
		else c=1;
		if(c>ans) ans=c;
	}
	cout<<ans;
    return 0;
}

P1075 NOIP 2012 普及组 质因数分解

🏷️ 核心考点: 质数判断、因数分解、开方优化

题目大意: 已知正整数 n 是两个不同质数的乘积,求较大的那个质数。

解题思路:

从最小的质数 2 开始尝试除 n。

一旦找到一个能整除 n 的数 i,那么 i 一定是较小的那个质数(因为是从2开始找的)。

另一个质数就是 n / i。

输出 n / i 即可。

C++ 关键点:

效率: 其实只需要循环到 sqrt{n} 即可。

逻辑: 题目保证了 n 一定是两个质数乘积,所以找到的第一个因数必然是质数,不需要额外写 is_prime 函数判断。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	cin>>n;
	for(int i=2;i*i<=n;i++){
		if(n%i==0){
			cout<<n/i;
			return 0;
		}
	}
	
    return 0;
}

P5726 【深基4.习9】打分

🏷️ 核心考点: 数组排序、求和、求最值

题目大意: n 个评委打分,去掉一个最高分,去掉一个最低分,求平均分。

解题思路:

读入所有分数存入数组。

计算总分 sum。

遍历数组找出 max_score 和 min_score。

计算公式:(sum - max_score - min_score) / (n - 2)。

C++ 关键点:

数据类型: 平均分通常有小数,计算结果要转为 double。

保留小数: 输出通常需要保留2位小数,使用 printf("%.2f", ans) 或 cout << fixed << setprecision(2) << ans;。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n,num,ma=-1000,mi=1000;
    double s=0;
    cin>>n;
    for(int i=0;i<n;i++){
    	cin>>num;
    	s+=num;
    	if(num>ma){
    		ma=num;
		}
		if(num<mi){
			mi=num;
		}
	}
	s=s-ma-mi;
	double avg=s/(n-2);
	printf("%.2lf",avg);
    return 0;
}

💡 给同学们的复习建议

多动手写代码: 不要只看思路,一定要在编译器里把代码敲一遍,特别是循环的边界条件。

注意变量类型: 看到小数一定要用 double,看到大整数(超过20亿)要考虑 long long。

调试技巧: 如果结果不对,试着在循环里 cout 中间变量的值,看看是在哪一步出错的。

相关推荐
qq_269506757 分钟前
第28课-AJAX与前端框架
java
程序员清风8 分钟前
Java 后端如何接入大语言模型
java·spring boot·架构·aigc
xieliyu.12 分钟前
JVM 垃圾回收机制详解:从标记过程、回收算法到垃圾收集器
java·jvm·笔记·java-ee
JavacKaka14 分钟前
Redis大Key导致生产事故复盘博客-2026-09-18
java
辛苦才能18 分钟前
C++多态原理:虚函数表的内存布局与动态绑定的汇编真相
开发语言·c++
西西弗Sisyphus28 分钟前
Qt 实现一个 水波进度球
c++·qt·c
无忧.芙桃29 分钟前
数据结构之排序算法(中):冒泡排序与快速排序,从相邻交换到工程级优化
c语言·c++·排序算法
不会就选b29 分钟前
算法日常・每日刷题--<贪心>17
算法
右耳朵猫AI31 分钟前
Java周刊2026W38 | Micronaut 修补三漏洞、JDK 27 提速 54%、Jetty 修复抖动测试
java·后端·spring
事已至此先睡覺吧31 分钟前
第二篇:Java 基础语法:变量、数据类型、运算符与类型转换
java