UVA 11121 Base -2

  用负二进制表示一个数,如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 }

时间: 2024-10-17 10:45:07

UVA 11121 Base -2的相关文章

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

UVa 343 - What Base Is This?

题目:已知两个数字串,问他们分别是多少进制时相等. 分析:简单题.直接枚举每个数字的不同进制(最大的数字+1 ~ 36),转换成10进制判断相等即可. 说明:数值转换到10进制时数字不超过整形范围. #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using

UVa 948 - Fibonaccimal Base

题目:给你一个数字表示成fib数列元素加和的形式,如果有对应因子对应编号位为1,否则为0. 分析:Fib,数论.类似二进制数的表示方式. 算法1:已知正整数n: while n <> 0 找到第一个不大于自己的Fib数字Fk 得到新的n = n - Fk end while 输出所有找到的Fk 定理1:{F1,F2,..,Fn} 可以生成(某些元素和)1 ~ ΣFn之间的所有正整数. 证明1:1. {F1,F2}可以生成 1 ~ 3: 2. 设{F1,F2,..,Fn} 可以生成1 ~ ΣFn

uva 11595 - Crossing Streets EXTREME(切割多边形)

题目链接:uva 11595 - Crossing Streets EXTREME 对初始平面进行切割,得到所有平面,然后处理出所有边,有公共边的两个平面之间可以到达,对于城市的权值可以加到点上,进出各加一次即可. #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <complex> #in

uva 1318 - Monster Trap(bfs+暴力)

题目链接:uva 1318 - Monster Trap 每条线段2个点,加上起点终点一个是202个点,暴力判断连点之间是否可达,可达建边.因为线段有厚度考虑,所以将线段延伸一点再处理,这样原本共用一端点的线段变成相交.特殊情况是三点共线,这是判断延伸后的点是否落在其他线段上,如果是就不考虑这个点.最后做一遍bfs. #include <cstdio> #include <cstring> #include <cmath> #include <vector>

UVA 10817 - Headmaster&#39;s Headache

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1758 状态压缩的DP,dp[i][st]表示状态为st考虑后面i个人所有人最小花费, 因为每个科目有三种状态,可以用一个三进制数表示, 状态不是很多,所以可以把预先把每个数的三进制预处理出来, 决策为选和不选. #include<bits/std

UVA - 10229 - Modular Fibonacci (矩阵快速幂 + fibonacci)

题目传送:UVA - 10229 思路:就是简单的矩阵快速幂求fibonacci数列,然后注意可能中间结果会爆int,因为2^19有50多万 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #includ

UVA 11990 ``Dynamic&#39;&#39; Inversion

26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道和一般的分治的不同是左子问题可以用来解决右边的子问题. 今天下午YY了一个离线的分治做法. 对于每一个数字,构成逆序对除了val大小还和被删除的时间del有关,这实际上是一个三维偏序的问题. 一个元素是一个三元组e(pos,val,del),e1和e2对答案有贡献当且仅当e1.pos < e1.po

UVa 10969 (圆与圆之间的覆盖问题) Sweet Dream

题意: 有n个按先后顺序放置的不同大小不同位置的圆,求所有可见圆弧的长度. 分析: 这道题应该是大白书上例题 LA 2572 (求可见圆盘的数量) Kanazawa 的加强版,整体框架都差不多. 对于每个圆求出与其他圆相交的交点所对应的幅角(转化到[0, 2π]中),排个序,然后枚举每段弧的终点,如果不被后面放置的圆所覆盖则可见. 注意: 原本以为WA是精度问题,后来调大调小都一直WA,这里精度eps从1e-11到1e-13都没问题. 但是在判断弧的终点是否被圆所覆盖的时候要加上等号.也就是第6