本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。

 PTA的

5-1 近似求PI (10 分)本题要求编写程序,根据下式求Π的近似值,直到最后一项小于给定精度EPS

#include<stdio.h>
int main()
{
    double eps,x=0,y,z;
    double i=1,a,b,c=1,d=1,e;
    scanf("%le", &eps);
        for(i=1;i<=9999;i++)
        {
        c=1;
        d=1;
        e=2*i+1;
        for(a=1;a<=i;a++)
            {
            c*=1.0*a;
            }
        for(b=1;b<=e;b+=2)
            {
            d*=1.0*b;
            }
        y=1.0*c/d;
        x+=y;
        if(y<eps)
        break;
        }
    z=2.0*(x+1);
    printf("PI = %.5lf",z);
    return 0;
}

错误:

a.c: In function ‘main’: a.c:6:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%le", &eps); ^~~~~~~~~~~~~~~~~~

编译器:C (gcc 6.5.0)

有一种答案是这样的:

#include <stdio.h>
double is(int);
double rr(int);
int main()
{
 double eps;
 double s=0;double d;
 scanf("%le",&eps);
 for(int i=0;i<=999999;i++) 
 {
  d=1.0*is(i)/rr(2*i+1);
  s=s+d;
  if(d<eps)
  break;
 }
 printf("PI = %.5lf",2.0*s);
 return 0;
 } 
 double is(int m)
 {
  double s=1.0;
  for(int i=1;i<=m;i++) 
  {
   s=1.0*s*i;
  }
  return s;
 }
 double rr(int m)
 {  
  double s=1;
  for(int i=1;i<=m;i=i+2)
  {
   s=s*i;
  }
  return s;
  } 

两个区别在哪?

你这个不算错误,是因为pta的编译器版本比较新所以会报warning