https://vjudge.net/problem/AtCoder-4239
水题。
关于进制转换,就相当于以怎样的基数(余数)来看待一个数字。
题目大致是让我们将一个整数(-1e9~1e9)转化为负二进制数,并且由01串组成。
在表达的时候是不会出现-1搭配的情况的如(-3)不是(-1-1),而是1101,而我们计算n对(-2)取余的时候是会出现-1的,因此我们要把这个-1变成正1。举个例子,对于-5转化为负二进制,第一步为 -5= (-2 )*2(2为商)+(-1),我们要把最后这个(-1)变为1,那么只有改变商,即-5=(-2)*(2+1)+1。此时就得到了我们要的1 .
那么在处理的时候,就在标准的迭代中增加一个,如果余数为-1,不符合表达要求,就改为余数为1,而本身的值减2,使得经过处理的数再进入下一次的转换。
注意特判0。
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5; int n; int dig[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n; int cnt=0; if(n==0){ cout<<0<<endl; return 0; } while(n){ // cout<<n%(-2)<<endl; if(n%(-2)==-1){ dig[++cnt] = 1; n-=2; } else{ dig[++cnt] = (n%(-2)); } n/=(-2); // cout<<"n="<<n<<endl; } for(int i=cnt; i>=1; i--){ cout<<dig[i]; } }