C++算法竞赛篇(四)八道题带你拿下算法三大循环
C++算法竞赛篇(四)八道题带你拿下算法三大循环
- 前言
- C++循环语句while循环
-
- 第一题 反向输出一个四位数
- 第二题 求和一
- 第三题 计算多项式的值
- C++循环语句for循环
-
- 第一题 奥运奖牌计数
- 第二题 救援
- 第三题 计算分数加减表达式的值
- 第四题 求分数序列和
- C++循环语句do while循环
-
- 第一题 球弹跳高度的计算
前言
- 前面我们讲解了C++基础题型和输入输出题型
- 接下来我们开始讲解下一题型,条件判断题型
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法竞赛篇文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
C++循环语句while循环
第一题 反向输出一个四位数
题目链接https://ac.nowcoder.com/acm/contest/18839/1023
解题思路:
- 输入处理:用
cin
读取四位数n
。 - 反向输出逻辑:利用
while(n)
循环,通过n % 10
取最后一位数字输出,再用n = n / 10
去掉已输出的末位,直到n
变为0
(所有位处理完毕)。 - 输出格式:循环中逐位输出,直接拼接成反向数字。
#include using namespace std; int main() { int n = 0; cin >> n; while(n) { cout << n % 10; // 取末位输出 n = n / 10; // 去掉末位 } return 0; }
第二题 求和一
题目链接https://www.nowcoder.com/practice/ce0b2eacd3d04647831358c2876e44ff
解题思路:
- 输入处理:用
cin
读取整数n
。 - 求和逻辑:初始化累加变量
sum
为0
、计数器i
为0
;通过while(i <= n)
循环,每次将i
累加到sum
并使i
自增,直到i
超过n
。 - 输出格式:循环结束后直接输出
sum
。
#include using namespace std; int main() { int n; cin >> n; long long sum = 0; int i=0; while(i<=n) { sum = sum +i; i ++; } cout << sum; }
第三题 计算多项式的值
题目链接https://www.luogu.com.cn/problem/B2080
解题思路:
- 输入处理:用
cin
读取实数x
和整数n
。 - 多项式计算逻辑:初始化
sum=1
(对应x⁰
)、r=1
(当前项初始值);通过while(n--)
循环n
次,每次更新r = r * x
(下一项)并累加到sum
。 - 输出格式:用
printf(\"%.2f\", sum)
保留两位小数输出。
#include using namespace std; int main() { int n; double x; cin >> x >> n; double sum=1; double r=1; while (n--) { r = r * x; // 更新当前项为下一项 sum = sum + r; // 累加到总和 } printf(\"%.2f\", sum); return 0; }
C++循环语句for循环
第一题 奥运奖牌计数
题目链接https://www.luogu.com.cn/problem/B2058
解题思路:
- 输入处理:用
cin
读取届数n
。 - 统计逻辑:初始化
p1, p2, p3
记录金银铜牌总数;通过for(int i=1; i<=n; i++)
循环n
次,每次读取当届奖牌数并累加。 - 输出格式:计算总奖牌数
sum = p1+p2+p3
,按顺序输出p1 p2 p3 sum
。
#include using namespace std; int a, b, c; int p1, p2, p3; int sum; int main() { int n = 0; cin >> n; for(int i = 1; i <= n; i++) { cin >> a >> b >> c; p1 += a; // 累加金牌 p2 += b; // 累加银牌 p3 += c; // 累加铜牌 } sum = p1 + p2 + p3; cout << p1 << \" \" << p2 << \" \" << p3 << \" \" << sum << endl; return 0; }
第二题 救援
题目链接https://www.luogu.com.cn/problem/B2066
解题思路:
- 输入处理:用
cin
读取救援点数量n
。 - 时间计算逻辑:初始化总时间
t=0
;通过for(int i=0; i<n; i++)
循环n
次,每次读取坐标(x,y)
和人数p
,计算距离dis = sqrt(x²+y²)
,再累加“赶路+救援+返程”时间。 - 输出格式:用
ceil(t)
向上取整总时间,转换为int
输出。
#include #include using namespace std; int n; double x, y; int p; int main() { cin >> n; double t = 0; for (int i = 0; i < n; i++) { cin >> x >> y >> p; float dis = sqrt(x * x + y * y); // 赶路时间 + 救援时间 + 返程时间 + 额外救援时间 t += p * 1 + dis / 50 + p * 0.5 + dis / 50; } cout << (int)ceil(t) << endl; // 向上取整并输出 return 0; }
第三题 计算分数加减表达式的值
题目链接https://www.luogu.com.cn/problem/B2070
解题思路:
- 输入处理:用
cin
读取整数n
。 - 表达式计算逻辑:初始化
sn=0
(累加和)、flag=1
(符号标记,初始为正);通过for(int i=1; i<=n; i++)
循环,每次累加flag*1.0/i
并翻转flag
符号。 - 输出格式:用
printf(\"%.4f\\n\", sn)
保留四位小数输出。
#include using namespace std; int main() { int n = 0; double sn = 0; int flag = 1; // 符号标记,1为正,-1为负 cin >> n; for(int i = 1; i <= n; i++) { sn += flag * 1.0 / i; // 累加当前项(带符号) flag = -flag; // 翻转符号 } printf(\"%.4f\\n\", sn); return 0; }
第四题 求分数序列和
题目链接https://www.luogu.com.cn/problem/B2069
解题思路:
- 输入处理:用
cin
读取整数n
。 - 序列求和逻辑:初始化
sum=0
(累加和)、p=1
(分母)、q=2
(分子);通过for(int i=1; i<=n; i++)
循环,每次累加q*1.0/p
,再更新q = q+p
(下一项分子)、p = q-p
(下一项分母,即原分子)。 - 输出格式:用
printf(\"%.4f\\n\", sum)
保留四位小数输出。
#include using namespace std; int main() { int n = 0; double sum = 0; double p = 1; double q = 2; cin >> n; for (int i = 1; i <= n; i++) { sum += q / p; // 累加当前项 q = q + p; // 更新分子为“当前分子+分母” p = q - p; // 更新分母为“原分子”(利用 q 已更新的特性) } printf(\"%.4f\\n\", sum); return 0; }
C++循环语句do while循环
第一题 球弹跳高度的计算
题目链接https://www.luogu.com.cn/problem/B2076
解题思路:
- 输入处理:用
cin
读取初始高度n
(赋值给h
)。 - 路程与反弹计算逻辑:初始化
total = h
(第一次落地路程)、i=1
(计数器);通过do-while(i <= 9)
循环9次(处理第2~10次落地的反弹-下落),每次更新h /= 2
(反弹高度)并累加h*2
(上去+下落路程)到total
。 - 输出格式:循环结束后,输出总路程
total
和第10次反弹高度(h / 2
)。
#include using namespace std; int main() { int n = 0; float total = 0; cin >> n; float h = n; total += h; // 第一次落地的路程 int i = 1; do { h /= 2; // 反弹高度 total += h * 2; // 上去+下落的路程 i++; } while (i <= 9); // 循环9次,处理第2~10次落地 cout << total << endl; cout << h / 2 << endl; // 第10次反弹高度 return 0; }
以上就是这篇博客的全部内容,下一篇我们将继续探索C++算法的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法竞赛篇文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482