博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1065 A+B and C (64bit)
阅读量:6650 次
发布时间:2019-06-25

本文共 1263 字,大约阅读时间需要 4 分钟。

题意:

给出三个64位的整型数A,B,C(范围在[-2^63^, 2^63^]),比较A+B是否大于C。

思路:

一开始我想这题考察的是大整数运算,因为long long的范围是[-2^63, 2^63),取不到2^63。但是,看过《算法笔记》后发现,这一题不需要用BigN的方式来做,考察的是整型的溢出。需要说明的是,本题给出的范围[-2^63, 2^63]应该是写错了,经过测试,发现A或B并没有取到2^63的情况!范围应该是[-2^63, 2^63),因此可用long long int型整数存储数据。(PAT坑!)

若A>0,B>0,而A+B<0,说明A+B的值超过了最大正数的表示范围,因而发生了正溢出,显然有A+B>C;

若A<0,B<0,而A+B>=0,说明A+B的值超过了最大负数的表示范围,因而发生了负溢出,显然有A+B<C;

而其余未发生溢出的情况,则按正常的比较即可。

或许有人会对上面的边界不知如何确定,可以自己验证一下。(其中<limits.h>包含了常数LLONG_MAX和LLONG_MIN,当然也可以自己定义)。可见,若A,B都是小于0的情况,溢出的边界应该 >=0 ,这里会卡1个测试点。

#include 
#include
int main(){ //long long int LLONG_MAX=0x7fffffffffffffff; //long long int LLONG_MIN=-LLONG_MAX-1; printf("%lld\n",LLONG_MAX+LLONG_MAX);//两个最大long long相加,结果为-2 printf("%lld\n",LLONG_MIN+LLONG_MIN);//两个最小long long相加,结果为0 return 0;}

代码:

#include 
int main(){ int T; long long int a,b,c,sum; scanf("%d",&T); for(int i=1;i<=T;i++){ scanf("%lld%lld%lld",&a,&b,&c); sum=a+b; printf("Case #%d: ",i); if(a>0 && b>0 && sum<0) printf("true\n"); else if(a<0 && b<0 && sum>=0) printf("false\n"); else if(sum>c) printf("true\n"); else printf("false\n"); } return 0;}

 

转载于:https://www.cnblogs.com/kkmjy/p/9533129.html

你可能感兴趣的文章
c语言程序报告函数关系描述,《C语言程序设计》实验报告
查看>>
c语言while(scanf =eof),while(scanf("%d",&n)!=EOF)
查看>>
计算机二级c语言编程题评分标准,计算机二级C语言题型和评分标准
查看>>
c语言自定义函写计算器,C语言实现计算器功能
查看>>
C语言猜电脑随机数源代码,c语言(随机数)的问题
查看>>
鸿蒙os相机,鸿蒙os有什么功能-有什么特殊之处
查看>>
微信html5图片裁切,微信小程序图片裁剪工具we-cropper
查看>>
小学生学计算机flash,利用Flash软件进行小学电脑绘画教学
查看>>
html form 与table,form和table的区别
查看>>
【原创】MySQL 模拟Oracle邻接模型树形处理
查看>>
SSD上如何进行数据保护?
查看>>
Verizon:2012年数据破坏调查报告
查看>>
今日你以老师为荣,明日老师以你为荣!
查看>>
华为交换机VRP用户界面配置及Telnet登录实验
查看>>
Cobbler无人值守安装系统史上最细实践文档
查看>>
第11章代码《跟老男孩学习Linux运维:Shell高级编程实战》
查看>>
一个资深系统管理员的O2O实践(二)
查看>>
ovs-vsctl emer-reset一个需要慎用的命令
查看>>
LVM配置与管理
查看>>
PIX8.0与两个PIX8.0建立L2L ***
查看>>