zoukankan      html  css  js  c++  java
  • POJ3191【(-2)进制本质】

    题意:

    实现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;
    }


  • 相关阅读:
    CSS资料:IE8 CSS hack
    作为前端制作师你必须知道的事情!
    TABLE的1PT边框
    IE6 png图片的支持
    开源公司IronTec将推动PHP进驻Android平台
    终于解决了FLASH 播放器的问题了
    Windows7 添加快速启动栏
    不能调试存储过程的解决方法
    给Asp.Net Forums的后台管理菜单做一个树形外衣
    Asp.net Forums与Cnforums研究文章集合
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777460.html
Copyright © 2011-2022 走看看