study in pta

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);
}

你的代码问题:

  1. 分母计算错误nn/(i+2) 没有正确计算分母 3×5×7×...×(2i+1)

  2. 循环条件错误:应该用精度控制循环,而不是固定次数

  3. 缺少精度判断:题目要求"直到最后一项小于给定精度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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值