hdu 2116(判断是否溢出)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2116

题目大意就是给你两个k位数,然后相加,判断是否溢出。

思路:如果一正一负,那肯定不会溢出,其他情况就都转化为二进制来做,只要判断最后结果的位数就行了。

View Code
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int main(){
 7     int k;
 8     while(~scanf("%d",&k)){
 9         __int64 n,m;
10         scanf("%I64d%I64d",&n,&m);
11         if((n<0&&m>=0)||(n>=0&&m<0)){
12             printf("WaHaHa\n");
13             continue;
14         }
15         int tag=0;
16         if(n<=0&&m<=0){
17             n=-1*n;
18             m=-1*m;
19             tag=1;
20         }
21         string s1="",s2="",s3="";
22         int i,j,c=0,l=0;
23         while(n){
24             s1+=n%2+'0';
25             n/=2;
26         }
27         while(m){
28             s2+=m%2+'0';
29             m/=2;
30         }
31         for(i=0,j=0;i<s1.size()&&j<s2.size();i++,j++){
32             l=(c+(s1[i]-'0'+s2[j]-'0'))%2;
33             s3+=l+'0';
34             c=(c+s1[i]-'0'+s2[j]-'0')/2;
35         }
36         while(i<s1.size()){
37             l=(c+(s1[i]-'0'))%2;
38             s3+=l+'0';
39             c=(c+s1[i++]-'0')/2;
40         }
41         while(j<s2.size()){
42             l=(c+(s2[j]-'0'))%2;
43             s3+=l+'0';
44             c=(c+s2[j++]-'0')/2;
45         }
46         if(c)s3+=c+'0';
47         reverse(s3.begin(),s3.end());
48         if(tag&&s3.size()==k){
49             //如果都是负数的话,当相加刚好位k位时,那么最小是最高位为1,其余都是0,否则就会溢出;
50             //比如(-15)+(-1)=10000,此时k为5,表示-16.
51             for(i=1;i<s3.size();i++){
52                 if(s3[i]=='1'){
53                     printf("Yes\n");
54                     break;
55                 }
56             }
57             if(i==s3.size())printf("WaHaHa\n");
58         }else if(s3.size()+1<=k){
59             printf("WaHaHa\n");
60         }else 
61             printf("Yes\n");
62     }
63     return 0;
64 }

 

posted @ 2013-03-19 20:48  ihge2k  阅读(231)  评论(0编辑  收藏  举报