ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

PTA基础编程题目集 7-15计算圆周率(C++语言实现)

2026/8/7 9:08:39 拓冰建站 浏览量
PTA基础编程题目集 7-15计算圆周率(C++语言实现) 摘要本文是PTA编程题计算圆周率的题解涵盖题目描述、输入输出格式及C语言实现展示无穷级数递推迭代与循环控制方法。题目描述根据下面关系式求圆周率的值直到最后一项的值小于给定阈值。关系式π/2 1 1/3 2!/(3×5) 3!/(3×5×7) ... n!/(3×5×7×...×(2n1)) ...输入格式输入在一行中给出小于1的阈值。输出格式在一行中输出满足阈值条件的近似圆周率输出到小数点后6位。输入样例0.01输出样例3.132157解题思路核心问题分析本题是一个典型的无穷级数求和问题。核心任务是根据给定的无穷级数公式计算π/2的近似值当某一项的值小于给定阈值时停止累加最后乘以2得到圆周率π。关键在于理解级数通项的递推关系避免重复计算阶乘和乘积控制循环终止条件最后一项的值 阈值时停止算法原理说明观察级数通项的规律使用递推迭代法高效计算每一项设第n项为 aₙ则a₀ 1第0项对应 n0a₁ 1/3第1项对应 n1a₂ 2!/(3×5) (1×2)/(3×5)第2项对应 n2a₃ 3!/(3×5×7) (1×2×3)/(3×5×7)第3项对应 n3递推关系推导aₙ / aₙ₋₁ [n!/(3×5×…×(2n1))] / [(n-1)!/(3×5×…×(2n-1))] n / (2n 1)因此aₙ aₙ₋₁ × n / (2n 1)这样每一项可以由前一项递推得到无需每次重新计算阶乘和连乘时间复杂度O(k)k为迭代次数。具体计算步骤输入阈值 threshold小于1的正数初始化sum 1.0累加和已加入第0项 a₀ 1term 1.0当前项初始为 a₀n 1下一项的序号循环迭代计算新项term term × n / (2n 1)即 aₙ aₙ₋₁ × n/(2n1)累加到总和sum sum term判断若 term threshold → 跳出循环停止累加否则n n 1继续迭代计算圆周率pi 2.0 × sum输出pi保留6位小数验证样例threshold 0.01a₀ 1sum 1n1: a₁ 1 × 1/3 0.33333sum 1.333330.33333 0.01 → 继续n2: a₂ 0.33333 × 2/5 0.13333sum 1.466660.13333 0.01 → 继续n3: a₃ 0.13333 × 3/7 ≈ 0.05714sum ≈ 1.523810.05714 0.01 → 继续n4: a₄ 0.05714 × 4/9 ≈ 0.02540sum ≈ 1.549210.02540 0.01 → 继续n5: a₅ 0.02540 × 5/11 ≈ 0.01155sum ≈ 1.560760.01155 0.01 → 继续n6: a₆ 0.01155 × 6/13 ≈ 0.00533sum ≈ 1.566090.00533 0.01 → 停止pi 2 × 1.56609 ≈ 3.13218 → 接近样例输出3.132157 ✓代码部分实现#includeiostream#includecstdiousingnamespacestd;intmain(void){doublethreshold;cinthreshold;doublesum1.0;doubleterm1.0;intn1;while(1){term*(double)n/(2*n1);sumterm;if(termthreshold){break;}n;}doublepi2.0*sum;printf(%.6f\n,pi);return0;}代码流程说明头文件引入与命名空间声明#include iostream引入标准输入输出流头文件#include cstdio引入C标准I/O头文件提供printf格式化输出using namespace std;使用std命名空间主函数入口int main(void)程序主函数入口数据输入double threshold;定义阈值变量双精度浮点型cin threshold;读取用户输入的阈值变量初始化double sum 1.0;累加和初始化已包含第0项 a₀ 1double term 1.0;当前项初始化初始值为第0项 a₀ 1int n 1;下一项的序号从1开始因为a₀已处理while循环递推累加while (1)无限循环由内部条件break控制退出循环体内term * (double)n / (2 * n 1);递推计算下一项term_new term_old × n / (2n 1)(double)n 将整型n强制转换为浮点型确保浮点除法sum term;将新计算的项累加到总和sum中if (term threshold)判断当前项是否小于阈值条件为真 →break;跳出循环停止累加n;项序号n加1准备计算下一项计算圆周率并输出double pi 2.0 * sum;由关系式 π/2 sum得 π 2 × sumprintf(%.6f\n, pi);格式化输出pi%.6f浮点数保留6位小数\n输出换行符程序结束return 0;返回0程序正常退出代码流程图是 满足条件否 继续迭代开始引入头文件 iostream, cstdio定义变量 threshold输入阈值 threshold初始化 sum1.0, term1.0, n1进入 while 1 循环term term * n / (2n1)递推计算下一项sum sum term累加到总和term threshold?break 跳出循环n 项序号加1pi 2.0 * sum计算圆周率printf输出pi保留6位小数程序结束解题流程图否是 停止累加开始输入阈值 threshold初始化累加器 sum1当前项 term1项序号 n1循环: 计算下一项递推公式:term term × n / (2n1)sum sum term 累加term 阈值?n n 1 进入下一轮圆周率 pi 2 × sum格式化输出pi 保留6位小数结束