判断两个数的和是否溢出
k=64时单独考虑
# include <stdio.h> # include <math.h> int main() { int k; __int64 a,b,c,d; while(scanf("%d",&k)!=EOF) { scanf("%I64d%I64d",&a,&b); c=(__int64)(pow(2,k-1)+0.001)-1; d=(-1)*(__int64)(pow(2,k)+0.001); if((a<0&&b>0)||(a>0&&b<0)) { puts("WaHaHa"); continue; } if(k==64) { if(a>0&&b>0&&c-a<b) printf("Yes\n"); else if(a<0&&b<0&&d-a>b) printf("Yes\n"); else printf("WaHaHa\n"); continue; } if(a>0&&c-a<b) printf("Yes\n"); else if (a<0&&d-a>=b) printf("Yes\n"); else printf("WaHaHa\n"); } return 0; }
判断两个数和的位数
#include<stdio.h> #include<string.h> __int64 a[70],b[70]; int main() { __int64 d,c; int num,k,i,flag,j; while(scanf("%d",&k)!=-1) { flag=0; scanf("%I64d%I64d",&c,&d); num=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); if((c<0&&d>0)||(c>0&&d<0)) { puts("WaHaHa"); continue; } if(c<0&&d<0) {c=-c;d=-d;flag=1;} while(c) { a[num++]=c%2; c=c/2; } num=0; while(d) { a[num]+=d%2; num++; d/=2; } for(i=0;i<68;i++) { a[i+1]+=a[i]/2; a[i]=a[i]%2; } for(i=68;i>=0;i--) if(a[i]!=0)break; if(i==k-1&&flag==1) { for(j=i-1;j>=0;j--) if(a[j]!=0)break; } if(i<k-1)puts("WaHaHa"); else if(i==k-1&&flag==1&&j<0) puts("WaHaHa"); else puts("Yes"); } return 0; }