我正在做一个接近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);
}
}发布于 2011-06-19 11:49:43
%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-19 11:51:15
scanf()语句也需要使用%lld。pi += pow(-1.0,e) / (2.0*e +1.0);
main().
int main(void),最好在它忽略其参数时指定int main(void),尽管与其余部分相比,这不是一种分类声明。
main()末尾的返回,并且我自己也不使用它;我编写return 0;是为了显式。我认为使用long long编写整个算法是值得怀疑的;数据类型可能应该更像long double ( scanf()格式使用%Lf,printf()格式使用%19.16Lf。
发布于 2011-06-19 10:40:15
首先,%d用于int
因此%1.16lld没有任何意义,因为%d是一个整数
如果你这样做,也是不必要的,直接使用类型,使代码更具可读性。
您想要使用的是double类型,用于计算pi,然后使用%f或%1.16f。
https://stackoverflow.com/questions/6400180
复制相似问题