Skew Binary
Skew Binary |
When a number is expressed in decimal, the k-th digit represents a multipleof 10k. (Digits arenumbered from right to left, where the least significant digit is number 0.)For example,
When a number is expressed in binary, the k-th digit represents a multiple of2k. For example,
In skew binary, the k-th digit represents a multiple of 2k+1 - 1.The only possible digits are 0 and1, except that the least-significant nonzero digit can be a 2. For example,
The first 10 numbers in skew binary are 0, 1, 2, 10, 11, 12, 20, 100, 101,and 102. (Skew binary isuseful in some applications because it is possible to add 1 with at mostone carry. However, thishas 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 signalsthe 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 atmost 2 31 - 1 = 2147483647.Sample Input
10120 200000000000000000000000000000 10 1000000000000000000000000000000 11 100 11111000001110000101101102000 0
Sample Output
44 2147483646 3 2147483647 4 7 1041110737
Miguel A. Revilla
1998-03-10
这道题目的大意就是给予一个数,然后将其转换为斜二进制表示,直接套用题中的公式即可。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 40;
int num[N];
char str[N];
int ans;
int main() {
while (cin >> str) {
if (strcmp(str,"0") == 0)
break;
ans = 0;
int len = strlen(str);
for (int i = 0; i < len; i++)
num[i] = str[len-i-1] - '0';
for (int i = 0; i < len; i++) {
ans += num[i] * (pow (2,i+1) - 1);
}
cout << ans << endl;
memset(num,0,sizeof(num));
memset(str,0,sizeof(str));
}
return 0;
}