C语言通过级数计算π值结果错误,求代码问题排查及解决方法
代码错误点及修正方案
错误列表
- 输入和循环逻辑完全错误:你将
scanf放在了for循环内部,且for循环终止条件写死为k<=30000,同时错误判断循环变量k≥30000才给分子赋值,导致变量未初始化、循环次数不符合要求。正确逻辑是先读取用户输入的总项数n,校验n≥30000后再循环n次计算级数。 - 符号逻辑反转:你采用的莱布尼茨π级数公式为π/4 = 1 - 1/3 + 1/5 - 1/7 + ... ,第1项(k=1)应为正数,你现在奇数k赋值-1、偶数k赋值1,和要求的符号完全相反。
- 分母计算错误:你写的分母公式是
2.0*k+1.0,导致级数从第二项(1/3)开始累加,漏掉了首项1,结果必然偏小。正确的分母公式应为2.0*k - 1.0。 - 乘4的逻辑位置错误:你将
pi=4*pi放在了循环内部,相当于每累加一项就乘以4,最终结果会是累加和乘以4的n次方,和预期完全不符。应该是所有项累加完成后,再统一乘以4。 - 多余头文件引用:题目明确要求禁止使用math.h库相关函数,你代码中引入了该头文件需要删除。
- 输出逻辑错误:你将printf放在循环内部,会循环输出n次结果,应该在全部计算完成后再输出一次结果即可。
修正后代码
#include<stdio.h> int main(void){ double numerator, denominator, pi=0.0; int n, k; printf("input a total number of terms >=30000:"); scanf("%d",&n); // 校验项数合法性 if(n < 30000){ printf("项数需≥30000!\n"); return 1; } for (k=1;k<=n;k++){ // 处理符号,k为奇数时是正,偶数为负 if(k%2==0){ numerator = -1; }else{ numerator = 1; } denominator = 2.0*k - 1.0; pi += numerator/denominator; } // 全部累加完成后再乘4 pi = 4 * pi; printf("value of PI is= %lf\n",pi); return 0; }
内容的提问来源于stack exchange,提问作者cobaltbasalt
相关产品推荐
相关产品推荐

