ACM中关于__int64与long long 的区别
在做hdoj1019的时候碰到一个奇怪的问题当我把变量定义为longlong型的时候会出现runtimeerror(好像是里面出现除以0的情况),但是把longlong全...
在做hdoj 1019 的时候 碰到一个奇怪的问题 当我把变量定义为long long 型的时候会出现 runtime error(好像是里面出现除以0的情况),但是把long long 全改成 __inti64 就ac了,哪位大牛给我解释一下啊
runtime error的程序:
#include<iostream>
using namespace std;
int main()
{
__int64 s,a,b,n,i,t,tmp;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
scanf("%lld",&a);
s=a;
for(i=1;i<n;i++)
{
scanf("%lld",&b);
s=a*b;
long long tt;
while(b!=0)
{
tmp=b;
b=a%b;
a=tmp;
}
a=s/a;
}
printf("%lld\n",a);
}
return 0;
}
ac的程序:
#include<iostream>
using namespace std;
int main()
{
__int64 s,a,b,n,i,t,tmp;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
scanf("%I64d",&a);
s=a;
for(i=1;i<n;i++)
{
scanf("%I64d",&b);
s=a*b;
long long tt;
while(b!=0)
{
tmp=b;
b=a%b;
a=tmp;
}
a=s/a;
}
printf("%I64d\n",a);
}
return 0;
}
还有那个runtime error的程序 把输入输出改成cin cout 是可以ac的,为什么啊?
runtime error的程序是这个,一开始问题里发错了:
#include<iostream>
using namespace std;
int main()
{
long long s,a,b,n,i,t,tmp;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
scanf("%lld",&a);
s=a;
for(i=1;i<n;i++)
{
scanf("%lld",&b);
s=a*b;
long long tt;
while(b!=0)
{
tmp=b;
b=a%b;
a=tmp;
}
a=s/a;
}
printf("%lld\n",a);
}
return 0;
} 展开
runtime error的程序:
#include<iostream>
using namespace std;
int main()
{
__int64 s,a,b,n,i,t,tmp;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
scanf("%lld",&a);
s=a;
for(i=1;i<n;i++)
{
scanf("%lld",&b);
s=a*b;
long long tt;
while(b!=0)
{
tmp=b;
b=a%b;
a=tmp;
}
a=s/a;
}
printf("%lld\n",a);
}
return 0;
}
ac的程序:
#include<iostream>
using namespace std;
int main()
{
__int64 s,a,b,n,i,t,tmp;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
scanf("%I64d",&a);
s=a;
for(i=1;i<n;i++)
{
scanf("%I64d",&b);
s=a*b;
long long tt;
while(b!=0)
{
tmp=b;
b=a%b;
a=tmp;
}
a=s/a;
}
printf("%I64d\n",a);
}
return 0;
}
还有那个runtime error的程序 把输入输出改成cin cout 是可以ac的,为什么啊?
runtime error的程序是这个,一开始问题里发错了:
#include<iostream>
using namespace std;
int main()
{
long long s,a,b,n,i,t,tmp;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
scanf("%lld",&a);
s=a;
for(i=1;i<n;i++)
{
scanf("%lld",&b);
s=a*b;
long long tt;
while(b!=0)
{
tmp=b;
b=a%b;
a=tmp;
}
a=s/a;
}
printf("%lld\n",a);
}
return 0;
} 展开
5个回答
展开全部
__int64与long long 都是在32位平台开始使用的64位整数的数据类型,在存储方式和使用方式上没有区别。
两者的区别在于,它们命名的发起人不同,支持的平台不同。long long这个数据类型,是UNIX平台发起并支持的,而__int64是微软从win95(VC6)开始发起并支持的,在老的windows开发平台下(如VC6),不识别long long,而老的UNIX,也不识别_int64。当然,现在比较新的平台,两种数据格式和相关的定义、函数都可以兼容了。
同样,作为64位整数的printf输出格式定义,也是一样,微软使用的是%i64d,而UNIX使用的是%lld以及%llu(无符号64位)等形式。
实际上,无论哪一种,在实际效果上没有不同,只是因为定义者和使用环境造成的支持或不支持的问题。
而ACM中,编译识别系统偏向更多的支持微软系统的定义,因此应该使用__int64和%i64d
两者的区别在于,它们命名的发起人不同,支持的平台不同。long long这个数据类型,是UNIX平台发起并支持的,而__int64是微软从win95(VC6)开始发起并支持的,在老的windows开发平台下(如VC6),不识别long long,而老的UNIX,也不识别_int64。当然,现在比较新的平台,两种数据格式和相关的定义、函数都可以兼容了。
同样,作为64位整数的printf输出格式定义,也是一样,微软使用的是%i64d,而UNIX使用的是%lld以及%llu(无符号64位)等形式。
实际上,无论哪一种,在实际效果上没有不同,只是因为定义者和使用环境造成的支持或不支持的问题。
而ACM中,编译识别系统偏向更多的支持微软系统的定义,因此应该使用__int64和%i64d
展开全部
因为我们用的系统都是32位,所以在编译器中,int是32位,long long和__int64都是64位的,因此用哪个都行,相信我!你的问题出在,不论是long long还是__int64,如果你用printf输出,都必须用printf("%I64d\n",a)表示,千万不能用lld,用lld肯定错,你用cout就不会有这个困扰,这也就是为什么用cout能ac的原因。同理,建议你scanf最好你也别用lld,用%I64d。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
long long 在不同的系统中长度不一样。C语言有这样的约定:sort 两个字节,long 四个字节,int 则处在两者之间并随编译器不同而不同。没有直接对long long 定义,因而它的长度也是变化的(四个或八个字节)。而__int64 则是64位的。然而,__int64 也是没有直接定义的。在有些编译器中__int64 不可用(例如 eclipse),而有些编译器中 long long 不可用(例如 visual C++6.0)。所以我们在编译程序时应当先熟悉(可以使用sizeof() 来测试)编译器。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
long long 是32位的,__int64是64位的
他们的数的范围不一样啊
__int64 范围更大
他们的数的范围不一样啊
__int64 范围更大
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我感觉是 scanf("%lld",&标识符 ); 有问题,你可以用 "%ld" 试一下。
既然你用的是C++,那么你可以用 cin 来接收输入的数据。
还有,并不是所有变量都需要64位来存储。
既然你用的是C++,那么你可以用 cin 来接收输入的数据。
还有,并不是所有变量都需要64位来存储。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询