POJ3191- The Moronic Cowmpouter 十进制转负n进制

来源:互联网 发布:淘宝高颜值零食图片 编辑:程序博客网 时间:2024/05/22 04:48

题意:给一个十进制数,转为-2进制数

例如-13; 

1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13
所以答案是
110111

 其实和十进制转2转2差不多啦。。

---------------------十进制转2进制的过程--------------

1、先用num%2;得到的数  存入ans[0]

2、然后得到商num=num/2;

然后重复1、2直到num==0;

逆序输出ans[]数组就是二进制结果了 

---------------------十进制转-2进制的过程--------------

1、先用num%-2;得到的数  存入ans[0]  // 由于不管是正进制还是负进制,其基数都是正的【0,R】,所以如果ans[i]为负需要取绝对值  

2、num=num-ans[i];  //减去余数部分   

2、然后得到商 //由于是负数 例如-13 要除-2使得余数为1, 商应该是-7,因为-13-(-2*-7)=1 ,要得到7,应该用num=num-ans[i];然后再num=num/-2;

然后重复1、2直到num==0;

逆序输出ans[]数组就是负二进制结果了

-------------------------------------------------------------------

过程见图

注意要特判n=0的情况!



***************突然发现只有-2进制才能这样算。。、-3进制却不可以。、。。。后续更新。。。。。

*******************现在将代码改成下面这样的,-3进制也可以了。。。网上传的那份代码只可以计算-2进制,不能正确得到-3进制的答案,下面这份代码只要把2改成n就可以计算-n进制了。


 

#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std; int ans[100005];int main(){ int a,b;int n;scanf("%d",&n);if (!n) {printf("0\n");return 0;}int i=0;while(n){if (n>0)<span style="white-space:pre"></span>//n为正,和普通进制转换无异{ans[i]=n%2;n=n/-2;}else{if (  (-n)%2==0)   恰好整除,<span style="font-size: 12.380952835083px; font-family: Arial, Helvetica, sans-serif;">和普通进制转换无异</span>{ans[i]=0;n=n/-2;}else<span style="white-space:pre"></span>//不整除且被除数为负,商应该为 n的绝对值除以K(进制数),得到的商再进一,表示得到一个绝对值更大的负数,被除数与之相减才能得到正///的余数{ans[i]=((-n)/2+1)*(2)-(-n);     //余数的计算是根据得到的商*K(进制数)-原来的(n)的绝对值;也就是(-n)n=(-n)/2+1;}}  i++;}for (i--;i>=0;i--)printf("%d",ans[i]);printf("\n");return 0;}

0 0
原创粉丝点击