C C++两个超大数相加

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、C++的64位整数

在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long 和int 范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。

那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编译器对64位整数的扩展有所不同。基于ACM的需要,下面仅介绍VC6.0与g++编译器的扩展。

VC VC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与

0~18446744073709551615(约1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码:

1__int64 a;

2cin>>a;

3cout<

那么,在第2行会收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的错误;在第3行会收到“error C2593: 'operator <<' is ambiguous”的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用C的写法:

scanf("%I64d",&a);

printf("%I64d",a);

就可以正确输入输出了。当使用unsigned __int64时,把"I64d"改为"I64u"就可以了。

OJ通常使用g++编译器。其64位扩展方式与VC有所不同,它们分别叫做long long 与unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用1long long a;

2cin>>a;

3cout<

也可以使用

scanf("%lld",&a);

printf("%lld",a);

使用无符号数时,将"%lld"改成"%llu"即可。

最后我补充一点:作为一个特例,如果你使用的是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。

posted on 2006-08-16 13:40 踏雪赤兔阅读(8408) 评论(16)编辑收藏引用所属分类: 玩转编程

FeedBack:

# re: C++的64位整数[原]by 赤兔

2006-08-17 16:24 | SiCheng(Optimistic)

受教了怪不的FAQs里面直接就用了

scanf("%I64d",&a);

printf("%I64d",a);

呵呵所以还没试过cout , cin用于__int64.

2 3 4 5 6 7 8 9 10 #include

using namespace std;

int GetLength(char*);

bool GetNum(char*,char*,int*,int*); bool IsPositive(char*);

int AbsCmp(int*,int*);

bool AddUp(int*,int*,int*,bool); void DisBuf(int* InBuf);

int main()

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54 char ChBufA[10002];

char ChBufB[10002];

int InBufA[2002]={0};

int InBufB[2002]={0};

int InBufC[2002]={0};

bool PosA;

bool PosB;

bool PosC = true;

cin>>ChBufA>>ChBufB;

PosA = IsPositive(ChBufA);

PosB = IsPositive(ChBufB);

GetNum(ChBufA,ChBufB,InBufA,InBufB);

int ABigger = AbsCmp(InBufA,InBufB);

switch(ABigger)

{

case 0:

AddUp(InBufB,InBufA,InBufC,PosA == PosB); PosC = PosB;

break;

case 1:

AddUp(InBufA,InBufB,InBufC,PosA == PosB); PosC = PosA;

break;

case 2:

if((PosA == PosB) & (PosA == true))

{

AddUp(InBufA,InBufB,InBufC,true);

PosC = PosA;

}

else

break;

}

if(!PosC)

cout<<'-';

DisBuf(InBufC);

system("pause");

return 0;

相关文档
最新文档