forked from kdn251/interviews
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SkewBinary.java
executable file
·71 lines (68 loc) · 2.42 KB
/
SkewBinary.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
* When a number is expressed in decimal, the k-th digit represents a multiple of 10k. (Digits are numbered
* from right to left, where the least significant digit is number 0.) For example,
* 8130710 = 8 × 104 + 1 × 103 + 3 × 102 + 0 × 101 + 7 × 100 = 80000 + 1000 + 300 + 0 + 7 = 81307.
* When a number is expressed in binary, the k-th digit represents a multiple of 2
* k. For example,
* 100112 = 1 × 2
* 4 + 0 × 2
* 3 + 0 × 2
* 2 + 1 × 2
* 1 + 1 × 2
* 0 = 16 + 0 + 0 + 2 + 1 = 19.
* In skew binary, the k-th digit represents a multiple of 2
* k+1 − 1. The only possible digits are 0
* and 1, except that the least-significant nonzero digit can be a 2. For example,
* 10120skew = 1×(25 −1)+ 0×(24 −1)+ 1×(23 −1)+ 2×(22 −1)+ 0×(21 −1) = 31+ 0+ 7+ 6+ 0 = 44.
* The first 10 numbers in skew binary are 0, 1, 2, 10, 11, 12, 20, 100, 101, and 102. (Skew binary is
* useful in some applications because it is possible to add 1 with at most one carry. However, this has
* nothing to do with the current problem.)
* Input
* The input file contains one or more lines, each of which contains an integer n. If n = 0 it signals the
* end of the input, and otherwise n is a nonnegative integer in skew binary.
* Output
* For each number, output the decimal equivalent. The decimal value of n will be at most 2
* 31 − 1 =
* 2147483647.
* Sample Input
* 10120
* 200000000000000000000000000000
* 10
* 1000000000000000000000000000000
* 11
* 100
* 11111000001110000101101102000
* 0
* Sample Output
* 44
* 2147483646
* 3
* 2147483647
* 4
* 7
* 1041110737
*/
//https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=516
import java.math.BigInteger;
import java.util.Scanner;
public class SkewBinary {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
BigInteger number = input.nextBigInteger();
if (number.equals(BigInteger.ZERO)) {
break;
}
int length = (number + "").length();
BigInteger sum = BigInteger.ZERO;
for (int i = 0; i < length; i++) {
BigInteger mod10 = number.mod(BigInteger.TEN);
BigInteger insideBrackets = BigInteger.valueOf((long) (Math
.pow(2, i + 1) - 1));
sum = sum.add((mod10).multiply(insideBrackets));
number = number.divide(BigInteger.TEN);
}
System.out.println(sum);
}
}
}