SYCOJ1717负二进制

题目—负二进制 (shiyancang.cn)

进制的实质在于对于进制数的选择,选择不满足的填入当前的位置,然后除掉,继续开始选择。但是对于本题,是负数,但是进制上的数字为正数,所以就要调整,借位,因为符号不同,所以借位就是增加,进位就是减去。还有循环进位

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+520;
int n,k=0;
int ans[N];
int main()
{
	scanf("%d",&n); 
	if(n==0) 
	{
		cout<<0;
		return 0;
	}
	while(n)
	{
		ans[++k]=n%-2;
		n/=-2;
	} 
	for(int i=1;i<=k;i++)
	{
		if(ans[i]<0) ans[i+1]+=((ans[i]%-2+-2)/-2),ans[i]=abs((ans[i]%-2+-2)%-2);
		if(ans[i]>=2) ans[i+1]+=(ans[i]/-2),ans[i]%=-2; 
	}
	if(ans[k+1]<2&&ans[k+1]>=0) k++;
	while(ans[k+1]>=2||ans[k+1]<0)
	{
		if(ans[k+1]<0) ans[k+2]+=((ans[k+1]%-2+-2)/-2),ans[k+1]=abs((ans[k+1]%-2+-2)%-2),k++;
		if(ans[k+1]>=2) ans[k+2]+=(ans[k+1]/-2),ans[k+1]%=-2,k++; 
	}
	if(ans[k+1]<2&&ans[k+1]>=0) k++;
	while(!ans[k]) k--;
	for(int i=k;i>=1;i--) cout<<ans[i];
	puts("");
	return 0;
} 

  

 

posted @ 2021-07-13 23:34  mofan552  阅读(43)  评论(0)    收藏  举报