54

我正在做一个近似 PI 的程序,我正在尝试使用 long long,但它不起作用。这是代码

#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
    num pi;
    pi=0;
    num e, n;
    scanf("%d", &n);
    for(e=0; 1;e++){
      pi += ((pow((-1.0),e))/(2.0*e+1.0));
      if(e%n==0)
        printf("%15lld -> %1.16lld\n",e, 4*pi);
      //printf("%lld\n",4*pi);
    }
}
4

4 回答 4

73

%lld是标准的 C99 方式,但这不适用于我正在使用的编译器(mingw32-gcc v4.6.0)。在此编译器上执行此操作的方法是:%I64d

所以试试这个:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

scanf("%I64d", &n);

我知道以完全可移植的方式执行此操作的唯一方法是使用<inttypes.h>.

在您的情况下,它看起来像这样:

scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

它真的很丑……但至少它是便携的。

于 2011-06-19T03:49:43.167 回答
3
  • 你的scanf()语句也需要使用%lld
  • 您的循环没有终止条件。
  • 表达式中的括号太多而空格太少

    pi += pow(-1.0, e) / (2.0*e + 1.0);
    
  • 在循环的第一次迭代中添加一个,然后将 'pi' 的值设为零;这不会改变太多的价值。
  • 您应该使用 for 的显式返回int类型main()
  • 总的来说,最好指定int main(void)它何时忽略它的论点,尽管这不像其他的那样是一个明确的陈述。
  • 我不喜欢 C99 中授予的明确许可,以省略结尾的返回,main()并且自己不使用它;我写return 0;是明确的。

long long我认为使用;编写时整个算法是可疑的。数据类型可能应该更像long double%Lf对于scanf()格式,也许%19.16Lf对于printf()格式。

于 2011-06-19T03:51:15.090 回答
0

首先,%d 用于int

所以%1.16lld没有意义,因为 %d 是一个整数

您所做的 typedef 也是不必要的,直接使用类型,使代码更具可读性。

您要使用的是 type double,用于计算 pi 然后使用%for %1.16f

于 2011-06-19T02:40:14.857 回答
0
    // acos(0.0) will return value of pi/2, inverse of cos(0) is pi/2 
    double pi = 2 * acos(0.0);
    int n; // upto 6 digit
    scanf("%d",&n); //precision with which you want the value of pi
    printf("%.*lf\n",n,pi); // * will get replaced by n which is the required precision
于 2017-12-29T10:27:58.757 回答