-->

如何给printf很长很长如何给printf很长很长(How to printf long long

2019-05-12 04:17发布

我做了aproximate PI和我试图长长使用一个程序,但它不工作。 下面是代码

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

Answer 1:

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

这真的是非常难看......但至少它是便携式的。



Answer 2:

  • scanf()语句需要使用%lld了。
  • 您的循环没有终止条件。
  • 有太多太多的括号太少空间的表达

     pi += pow(-1.0, e) / (2.0*e + 1.0); 
  • 添加一个在循环的第一次迭代中,并且此后为零以“P1”的值; 这并没有太大的变化值。
  • 您应该使用一个明确的返回类型intmain()
  • 就整体而言,这是最好指定int main(void)时,它忽略它的参数,但小于其余的一个明确说法。
  • 我不喜欢在C99授予的明确许可省略从年底返回main()和不使用它自己; 我写return 0; 要明确。

我想用写的时候整个算法是可疑的long long ; 数据类型或许应该更像long double (以%Lfscanf()格式,也许%19.16Lfprintf()格式。



Answer 3:

首先,%d是一个int

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

这类型定义你做的,也是没有必要的,使用类型正前方,使一个更可读的代码。

你想用什么类型double ,计算圆周率,然后用%f%1.16f



Answer 4:

    // 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


文章来源: How to printf long long