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