1.0版本(属于是不会乱写了)
#include <stdio.h>
int main()
{ //double eps=1;
//scanf("%le", &eps);
double sum=1;
double each_fenshu=0;
double nn=1;
for(int i=1;i<n+1;i++)
{nn*=i;
each_fenshu=0;
each_fenshu+=nn/(i+2);
sum+=each_fenshu;
}
printf("PI = %.5f",sum);
}
你的代码问题:
-
分母计算错误:
nn/(i+2)没有正确计算分母3×5×7×...×(2i+1) -
循环条件错误:应该用精度控制循环,而不是固定次数
-
缺少精度判断:题目要求"直到最后一项小于给定精度eps"
deepseek解法一
#include <stdio.h>
int main() {
double eps;
scanf("%le", &eps);
double sum = 1.0; // 第一项是1
double term = 1.0; // 当前项的值
double numerator = 1.0; // 分子(i!)
double denominator = 1.0; // 分母(3×5×7×...)
int i = 1;
do {
numerator *= i; // 分子:i!
denominator *= (2 * i + 1); // 分母:3×5×7×...×(2i+1)
term = numerator / denominator; // 当前项
sum += term; // 累加
i++;
} while (term >= eps); // 直到项小于精度
double pi = sum * 2; // π = 和 × 2
printf("PI = %.5f\n", pi);
return 0;
}
只得了12分
满分15
deepseek解法二
#include <stdio.h>
int main() {
double eps;
scanf("%le", &eps);
double sum = 1.0; // 第一项是1
double term = 1.0; // 当前项的值
int i = 1;
while (term >= eps) {
term = term * i / (2 * i + 1); // 递推计算下一项
sum += term;
i++;
}
double pi = sum * 2;
printf("PI = %.5f\n", pi);
return 0;
}
满分
让我们来看看为什么
首先我决定先把我的代码改正确
#include <stdio.h>
int main()
{ //double eps=1;
//scanf("%le", &eps);
int n=100;
double sum1=1;
double sum2;
double each_fenshu=0;
double each_fenmu=1;
double each_fenzi=1;
for(int i=1;i<n+1;i++)
{each_fenzi*=i;
//printf("each_fenzi=%.5f\n",each_fenzi);
each_fenmu*=(i*2+1);
//printf("each_fenmu=%.5f\n",each_fenmu);
each_fenshu=0;
each_fenshu+=each_fenzi/each_fenmu;
//printf("each_fenshu=%.5f\n",each_fenshu);
sum1+=each_fenshu;
}
sum2=sum1*2;
printf("PI = %.5f",sum2);
}
不是题目要求但可以算pi
再看看怎么根据题目改
我先改double eps=1;
scanf("%le", &eps);
//int n=100;
但我不知道le怎么用的我问问先



看这几个应该就够了
写到这里是回头看了看deepseek解法一感觉也不难理解
我如果改我的代码也会这么写
但我也没看出哪里错了
看了测试eps较大,只取第1项这个测试点错了
deepseek修改版满分
#include <stdio.h>
int main() {
double eps;
scanf("%le", &eps);
double sum = 1.0; // 第一项是1
double term = 1.0; // 当前项的值
int i = 1;
// 先检查第一项是否已经满足精度要求
// 如果eps >= 1,那么第一项(1) >= eps,需要继续计算
// 如果eps > 1,那么第一项(1) < eps,直接结束
while (term >= eps) {
term = term * i / (2 * i + 1); // 计算下一项
sum += term;
i++;
}
double pi = sum * 2;
printf("PI = %.5f\n", pi);
return 0;
}
但我敏锐地发现注释错了
今天学习结束2025.10.13![]()


4334

被折叠的 条评论
为什么被折叠?



