首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打印long long

如何打印long long
EN

Stack Overflow用户
提问于 2011-06-19 10:36:32
回答 4查看 149.6K关注 0票数 54

我正在做一个接近PI的程序,我试图使用long long,但它不起作用。以下是代码

代码语言:javascript
复制
#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);
    }
}
EN

回答 4

Stack Overflow用户

发布于 2011-06-19 11:49:43

%lld是标准的C99方式,但在我使用的编译器(mingw32-gcc v4.6.0)上不起作用。在这个编译器上这样做的方法是:%I64d

所以试试这个:

代码语言:javascript
复制
if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

代码语言:javascript
复制
scanf("%I64d", &n);

据我所知,要以完全可移植的方式做到这一点,唯一的方法是使用<inttypes.h>中的定义。

在您的示例中,它将如下所示:

代码语言:javascript
复制
scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

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

票数 71
EN

Stack Overflow用户

发布于 2011-06-19 11:51:15

  • 你的scanf()语句也需要使用%lld
  • 你的循环没有终止表达式太多的圆括号和太少的空格

pi += pow(-1.0,e) / (2.0*e +1.0);

  • 你在循环的第一次迭代中加1,然后加0到‘pi’的值;这不会对值有太大影响。

  • 您应该为main().

  • On整体使用显式返回类型int main(void),最好在它忽略其参数时指定int main(void),尽管与其余部分相比,这不是一种分类声明。

  • 我不喜欢C99中授予的显式许可,它省略了main()末尾的返回,并且我自己也不使用它;我编写return 0;是为了显式。

我认为使用long long编写整个算法是值得怀疑的;数据类型可能应该更像long double ( scanf()格式使用%Lfprintf()格式使用%19.16Lf

票数 3
EN

Stack Overflow用户

发布于 2011-06-19 10:40:15

首先,%d用于int

因此%1.16lld没有任何意义,因为%d是一个整数

如果你这样做,也是不必要的,直接使用类型,使代码更具可读性。

您想要使用的是double类型,用于计算pi,然后使用%f%1.16f

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6400180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档