POJ3191【(-2)进制本质】
来源:互联网 发布:君自故乡来 应知故乡事 编辑:程序博客网 时间:2024/05/20 13:39
题意:
实现10进制数转换成-2进制数
思路:
有点意思,先扯些题外话,一个我们经常做的二进制:利用二进制有好多优化,大多都是利用了二进制能够表示一个数,然后优化了空间或者时间。
所以问题很清楚啊,就是一个10进制数被二进制数表示,再明白一点就是被2^0,2^1,2^2...2^n这些数组成,那么他是怎么求的呢?
很简单,对于每一个的特性他已经先处理了,比如最开始判断2^0=1是否需要,就是判断奇偶,然后重要的一步就是除以2,这里有一个忽略就是不管是奇数还是偶数除以2的答案都相等,然后就会相当于判断这个数对于2^1的"另类"奇偶,然后除以2以此类推。
但是我们看到 -2 进制是这样的 (-2)^0=1,(-2)^1=-2,(-2)^2=4...(-2)^n 有些位上是负数,负数怎么判断他是不是需要呢?
也就是那个二进制整除2我们所忽略的,考虑二进制,如果这个数对于当前是偶数,我们取0,意味这个位我们不取不要,但是如果是1呢,我们取了,所以对于当前数,我们要减去啊,然后整除2的话,刚好他就是自动减去了。现在考虑到(-2)进制,如果是正数位的话,我是奇数还是偶数都和二进制一样,整除2处理也没事,但如果是负数位呢,而且是需要这个负数位参与,那我其实还是减嘛,只不过现在减去了一个负数,所以最终答案应该是/2+1。对不对?对不对?对啊,就是这样!具体就可以看代码了。
//#include<bits/stdc++.h>#include<cstdio>#include<algorithm>#include<string.h>using namespace std;typedef long long LL;int ans[110],num;int main(){ int n; while(~scanf("%d",&n)) { num=0; int a,b; while(n) { a=n/(-2); b=n%(-2); if(b<0) { a++; b+=2; } ans[num++]=b; n=a; } if(!num) puts("0"); else { for(int i=num-1;i>=0;i--) printf("%d",ans[i]); puts(""); } } return 0;}
0 0
- POJ3191【(-2)进制本质】
- 进制转化 poj1220 poj3191
- poj1220(多种进制转换) poj3191(负数进制)
- The Moronic Cowmpouter poj3191(负进制转换以及其他进制转换模板)
- 进制的本质
- 进制的本质
- 进制的本质
- POJ3191-The Moronic Cowmpouter
- 理解进制的本质
- 引用 WCF 本质(2)
- Lisp 的本质(2)
- 《COM本质论》第一章学习(2)
- 2017.10.2 探寻本质
- WebService(一):本质
- 本质
- 本质
- 本质
- 本质
- 内存初探——什么是内存
- KVM虚拟化技术实践
- 1034. 有理数四则运算(20)
- 兼容性
- Spring3 MVC请求参数获取的几种方法
- POJ3191【(-2)进制本质】
- 监控应用层通信_hook_kifastcallentry(系统服务调用)
- 用maven搭建SpringMVC框架(二)
- wampServer多站点配置
- 1032. Sharing (25)
- 《未来简史》读书笔记
- mysql杂记
- android学习记录2:DatePicker的使用及设置其主题
- 鸡年寄语