leetcode 1017. 负二进制转换

题意:

给出数字 N,返回由若干 "0" 和 "1"组成的字符串,该字符串为 N 的负二进制(base -2)表示。

除非字符串就是 "0",否则返回的字符串中不能含有前导零。

 

示例 1:

输入:2

输出:"110"

解释:(-2) ^ 2 + (-2) ^ 1 = 2

 

示例 2:

输入:3

输出:"111"

解释:(-2) ^ 2 + (-2) ^ 1 + (-2) ^ 0 = 3

 

示例 3:

输入:4

输出:"100"

解释:(-2) ^ 2 = 4

 

提示:

0 <= N <= 10^9

 

思路:

这是一个数学问题,我们知道如果是转为二进制的话,就是不断取摸。如果对于转为负二进制采用同样的思路,我们的余数会出现负数,这要怎么办?

假设a / b = c....d,那么c * b + d = a,即c * b + b - b + d = a,(c+1)*b + (d - b) = a,所以当余数为负数时,我们让商加一,余数减去除数(这里为-2),就可以得到每一位上的值

 1 const int maxn=1e9;
 2 class Solution {
 3 public:
 4     string baseNeg2(int N) {
 5         if(N==0)return "0";
 6         string s="";
 7         while(N){
 8             int k=N%(-2);
 9             N/=-2;
10             if(k<0)N++,k+=2;
11             s+=('0'+k);
12         }
13         reverse(s.begin(),s.end());
14         return s;
15     }
16 };
View Code
posted @ 2019-10-29 20:16  ljy3268  阅读(333)  评论(0编辑  收藏  举报