HIT1002

这道题目的链接: 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值