http://acm.hdu.edu.cn/showproblem.php?pid=2116
判断两个k位带符号数的和有木有溢出。
判断的时候注意不能用两个数的和判断,否则溢出的话会有bug。
这里的方法是用最值减其中一个数,再和另一个数比较。
View Code
#include <stdio.h> int k; __int64 a,b; __int64 pow(int x,int y) { int i; __int64 s=1; for(i=0;i<y;i++) s*=x; return s; } #define MAX pow(2,63) int test() { __int64 max,min; if(k==64)min=-MAX,max=MAX-1; else min=-MAX>>k,max=(MAX>>k)-1; if(a==0&&b==0)return 0; if(a>0&&b<0)return 0; if(a<0&&b>0)return 0; if(a>0) return (max-a)<b; return (min-a)>b; } int main() { while(~scanf("%d",&k)) { scanf("%I64d%I64d",&a,&b); printf(test()?"Yes\n":"WaHaHa\n"); } return 0; }