如何长时间打印
我正在做一个aproximate程序,我试图用很长的时间,但它不工作。 这是代码
#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); } }
%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);
这真的是非常丑陋的…但至less它是便携式的。
- 您的
scanf()
语句也需要使用%lld
。 - 你的循环没有终止条件。
-
expression式中有太多的括号和太less的空格
pi += pow(-1.0, e) / (2.0*e + 1.0);
- 你在循环的第一次迭代中加一个,然后将零值赋给'pi'的值。 这并没有太大的改变。
- 你应该为
main()
使用显式的int
返回types。 - 总的来说,最好是在忽略它的参数时指定
int main(void)
,尽pipe这不像其他的那样是一个分类陈述。 - 我不喜欢C99给出的显式许可,以省略
main()
的结束返回,而不是自己使用; 我写return 0;
明确。
我认为整个algorithmlong long
书写时是可疑的; 数据types可能应该更像long double
( scanf()
格式为%Lf
, printf()
格式为%19.16Lf
。
首先,%d是一个int
所以%1.16lld
没有意义,因为%d是一个整数
这种typedef你做的,也是不必要的,直接使用types,做一个更可读的代码。
你要使用的是typesdouble
,用于计算pi,然后使用%f
或%1.16f
。