这道题目的链接: http://acm.hit.edu.cn/hojx/showproblem/1002/
题目: For each pair of integers A B and C ( -2^31 <= A, B, C<= 2^31-1 ), Output the result of A+B+C on a single line.
Hint: 请注意32位机上int的表示范围。
刚拿到这道题的时候,感觉看不明白提示,隐隐约约觉得好像和int数值在计算机中表示的范围有关系,具体说为啥,不知道,印象中和字节有关吧。还有这个2的31次幂-1是个什么鬼啊,怎么办?好慌啊,好想弄明白啊,但超烦这种细枝末节的东西,然并卵,我忍了,准备开始探寻一波这里面数字的奥秘。
查了若干资料后,涨姿势,为了方便,总结一下:
【基本概念】
二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。
其中8bit就称为一个字节(Byte),字节是计算机处理数据的基本单位,即以字节为单位解释信息。
字(word),计算机一次存取、处理和传输的数据长度称为字,即:一组二进制数码作为一个整体来参加运算或处理的单位。一个字通常由一个或多个字节构成,用来存放一条指令或一个数据。
字长,一个字中所包含的二进制数的位数称为字长。不同的计算机,字长是不同的,常用的字长有8位、16位、32位和64位等,也就是经常说的8位机、16位机、32位机或64位机。
例如,一台计算机如果用8个二进制位表示一个字,就说该机是八位机,或者说它的字长是8位的;又如,一个字由两个字节组成,即16个二进制位,则字长为16位。字长是衡量计算机性能的一个重要标志。字长越长,一次处理的数字位数越大,速度也就越快。
【本题应用】
32位机器中,int型的数据占4个字节,表示的范围有限,为-2^31到2^31-1(这个范围与有符号整数在计算机中的表示[补码]有关,本篇博客中不展开介绍,可以自行查阅相关资料)。超出这个范围的整数,可以用64位整数表示,其中有符号的64位整数表示的范围是-2^63到2^63-1,同时还有无符号的64位整数。当然超出这些范围的整数只能采用高精度数的方法来进行处理。本题中显然说明了三个数均满足-2^31 <= A, B, C<= 2^31-1,他们相加的结果在64位整数表示的范围内,所以本题应该通过处理64位整数的方法来处理三者相加的结果。
【64位整数定义和处理】
不同的编译器有不同的64位整数定义和处理方法。以下分别介绍Visual C++和G++两种编译器的处理。
- Visual C++使用类型说明符
"__int64"
和"unsigned __int64"
来分别定义有符号64位和无符号64位整型变量,在输入输出时要分别用"%I64d"
和"%I64u"
格式控制符。下面的代码可以输入/输出64位有符号整数:
__int64 a;
scanf("%I64d",&a);
printf("%I64d\n",a);
- G++使用类型说明符
"long long"
和"unsigned long long"
来分别定义有符号64位和无符号64位整型变量,在输入/输出时要分别用"%lld"
和"%llu"
格式控制符。下面的代码可以输入/输出64位有符号整数:
long long a;
scanf("%lld",&a);
printf("%lld\n",a);
【题解】
#include<stdio.h>
int main(){
long long a,b,c;
while(scanf("%lld%lld%lld",&a,&b,&c)==3)
printf("%lld\n",a+b+c);
return 0;
}