SSL-ZYC 2407 负进制

题目大意:
求一个数的负二进制


思路:

思路一:考场打表

我必须说一句:数据太水太水太水!!!!!!!
把题目描述给出的几组数据打表。。。60分!

代码:

#include <cstdio>
using namespace std;
int n;
int main()
{
    scanf("%d",&n);
    if (n==-13){puts("110111");return 0;}
    if (n==-1){puts("11");return 0;}
    if (n==-2){puts("10");return 0;}
    if (n==-3){puts("1101");return 0;}
    if (n==-4){puts("1100");return 0;}
    if (n==-5){puts("1111");return 0;}
    if (n==1){puts("1");return 0;}
    if (n==2){puts("110");return 0;}
    if (n==3){puts("111");return 0;}
    if (n==4){puts("100");return 0;}
    if (n==5){puts("101");return 0;}
    if (n==6){puts("11010");return 0;}
    if (n==7){puts("11011");return 0;}
    if (n==8){puts("11000");return 0;}
    if (n==9){puts("11001");return 0;}
    puts("0");  //打表
    return 0;
}

思路二:贪心

但是没有打。
好早就想到贪心。因为转二进制是可以用贪心的。所以负二进制也有可能用贪心。
事实证明,贪心是可以过的(同学 WYC 打出来并AC了)

思路三:取余法

考后看题解,发现正解是像求二进制一样的取余法。就是除以2求余,只不过要加几个符号而以。

AC正解代码:

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;

int n,a[100001],i,j;

int main()
{
    scanf("%d",&n);
    if (n==0)   //特殊判断
    {
        puts("0");
        return 0;
    }
    while (n!=0)  //取余开始
    {
        i++;
        a[i]=abs(n%2);
        n=-(n-a[i])/2;
    }
    for (j=i;j>=1;j--)
     printf("%d",a[j]);  //倒序输出
    return 0;
}
posted @ 2018-03-31 12:03  全OI最菜  阅读(88)  评论(0编辑  收藏  举报