1408. Problem - Number in Base RepresentationBase Representation
Convert number into different base representation.
1. Requirement
Convert an integer number into positive base 2 representation and negative base 2 representation.
2. Solution
2.1 Positive Base 2
Example:
Input : n = 13, base = 2
Output : 1101
1*(8) + 1*(4) + 0*(2) + 1*(1) = 13
Implementation.
public String base2(int n) {
StringBuilder res = new StringBuilder();
while (n != 0) {
res.append(n & 1);
n = n >> 1;
}
return res.length() > 0 ? res.reverse().toString() : "0";
}
2.2 Negative Base 2
Example:
Input : n = 13, base = -2
Output : 11101
1*(16) + 1*(-8) + 1*(4) + 0*(-2) + 1*(1) = 13
Implementation.
public String baseNeg2(int n) {
StringBuilder res = new StringBuilder();
while (n != 0) {
res.append(n & 1);
n = -(n >> 1);
}
return res.length() > 0 ? res.reverse().toString() : "0";
}
Test class.
public class Base2Test {
@Test
public void testBase2() {
System.out.println("testBase2");
Base2 instance = new Base2();
assertEquals("101", instance.base2(5));
assertEquals("1101", instance.base2(13));
assertEquals("100000", instance.base2(32));
}
@Test
public void testBaseNeg2() {
System.out.println("testBaseNeg2");
Base2 instance = new Base2();
assertEquals("101", instance.baseNeg2(5));
assertEquals("11101", instance.baseNeg2(13));
assertEquals("1100000", instance.baseNeg2(32));
}
}
2.3 Generic Solution
Generic solution for any base.
public class GenericBase {
// Given a decimal number n and an integer k, Convert decimal number n to base-k.
public String base(int n, int k) {
if (n == 0) {
return "0";
}
String ans = "";
while (n != 0) {
int r = n % k;
n /= k;
// if remainder is negative, add abs(base) to it and add 1 to n
if (r < 0) {
r += (-k);
n += 1;
}
// convert remainder to string add into the result
if (r <= 9) {
ans = r + ans;
} else {
ans = (char)(r - 10 + 'A') + ans;
}
}
return ans;
}
}
Test class.
public class GenericBaseTest {
@Test
public void testGenericBase() {
System.out.println("testGenericBase");
GenericBase instance = new GenericBase();
assertEquals("101", instance.base(5, 2));
assertEquals("1101", instance.base(13, 2));
assertEquals("100000", instance.base(32, 2));
assertEquals("101", instance.base(5, -2));
assertEquals("11101", instance.base(13, -2));
assertEquals("1100000", instance.base(32, -2));
assertEquals("21", instance.base(17, 8));
assertEquals("36", instance.base(30, 8));
assertEquals("11", instance.base(17, 16));
assertEquals("1E", instance.base(30, 16));
}
}