码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 11121 Base -2

时间:2015-10-03 23:04:08      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

  用负二进制表示一个数,如21=1+4+16,当num>21时最大用64-32表示32,否则最大用16即可,当num=31时,31-32=-1,在转入处理负数的函数中

技术分享
 1 /*0.003s*/
 2 #include <iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 int num,T,cas=1;
 9 char ans[40];
10 
11 void neg(int num);
12 
13 void not_neg(int num)//处理正数
14 {
15     long long  m=1,e=2,n=0;
16     while(num>m)
17         {
18             m=(m<<2)+1;//m=2^0+2^2+...+2^2n
19             e<<=2;//2^2n+1
20             n+=2;
21         }
22         while(num>1)
23         {
24             m>>=2;e>>=2;
25             if(num>m+e)//num>2^0+2^2+...+2^2(n-1)+2^2n-1时用2^2n
26             {
27                 ans[n--]=1;
28                 n--;
29                 num-=e<<1;
30             }
31             else if(num>m)//否则用-2^2n-1  +  2^2n
32             {
33                 ans[n--]=1;
34                 ans[n--]=1;
35                 num-=e;
36             }
37             else n-=2;
38         }
39         if(num<0) neg(num);//正负交替
40         else if(num==1) ans[0]=1;
41 }
42 
43 void neg(int num)//处理负数
44 {
45     num=-num;//转化为正数,类似正数处理
46     long long  m=2,e=4,n=1;
47     while(num>m)
48         {
49             m=(m<<2)+2;
50             e<<=2;
51             n+=2;
52         }
53         while(num>2)
54         {
55             m>>=2;e>>=2;
56             if(num>m+e)
57             {
58                 ans[n--]=1;
59                 n--;
60                 num-=e<<1;
61             }
62             else if(num>m)
63             {
64                 ans[n--]=1;
65                 ans[n--]=1;
66                 num-=e;
67             }
68             else n-=2;
69         }
70         if(num<0) not_neg(-num);//正负交替
71         else if(num==2) ans[1]=1;
72         else if(num==1) ans[0]=ans[1]=1;
73 }
74 int main()
75 {
76     scanf("%d",&T);
77     while(T--)
78     {
79         scanf("%d",&num);
80         printf("Case #%d: ",cas++);
81         memset(ans,0,sizeof(ans));//初始化所有字符为‘0’,之后只需置1即可
82         num>0?not_neg(num):neg(num);
83         int i=39;
84         while(ans[i]==0&&i>0) i--;//i>0至少留一位,全部为0时也符合
85  /*       num=0;
86         for(int j=0;j<=i;j++)
87             j&1?num-=(1<<j)*(ans[j]-‘0‘):num+=(1<<j)*(ans[j]-‘0‘);
88         printf("num=%d\n",num);//检验
89 */
90         for(;i>=0;i--)
91             putchar(ans[i]);
92         printf("\n");
93     }
94     return 0;
95 }
View Code

 

UVA 11121 Base -2

标签:

原文地址:http://www.cnblogs.com/cdyboke/p/4853961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!