问题定义:
在 skew binary表示中, 第 k 位的值 xk表示 xk.(2k+1-1)。每个位上的可能数字是 0 或1,最后面一个非零位可以是 2,例如, 10120(skew) = 1*(2^5-1) + 0*(2^4-1) + 1*(2^3-1)+ 2*(2^2-1)+ 0*(2^1-1) = 31 + 0 + 7 + 6 + 0 = 44.前十个 skew数是 0、1、2、10、11、12、20、100、101、以及 102。
输入数据
输入包含一行或多行,每行包含一个整数 n。如果 n = 0 表示输入结束,否则 n是一个 skew 数
输出要求
对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 2^31-1 =2147483647
输入样例
10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0
输出样例
44
2147483646
3
2147483647
4
7
1041110737
解题思路
skew数的相邻位上,基数之间没有等比关系。计算每一位的基数后,再把一个 skew数转换成十进制表示就很简单。对于长度为 k的 skew数,最后一位数字的基数为 2^k-1。由于转换成十进制后, n 不超过 231-1,因此输入 skew数的最大长度不超过 31。
用一个整型数组 base[31],依次存储 skew数最末位、倒数第 2位、…..、第 31位的基数值。使用这个数组,把每个 skew数转换成对应的十进制数。
base[0] = 1
base[k] = 2^(k+1)-1 = 2 * (2^k - 1)+1 = 2 * base[k -1] + 1
代码如下:
/* * *Declaration:The author of <<Accelerated C++>> has wrote in the end of that book: As you look for reading materimal, keep in mind that books on the shelf do not make you a better programmer. Ultimately, the only way to improve your programming is to write programs. >这些程序来自一些ACM书籍,作者只为提高编程能力,实现书中例题或练习。如有侵权,请联系作者,作者将立即删除。 * *联系邮箱:mingxinglai#gmail.com * */ #include <stdio.h> #include <string.h> #include <math.h> int main(int argc, char* argv[]) { int i, k, base[31], sum; char skew[32]; base[0] = 1; for( i = 1; i < 31; i++) base[i] =(int)(pow(2,i+1) - 1); while(1) { scanf("%s",skew); if( strcmp(skew,"0") == 0) break; sum = 0; k = strlen( skew ); for( i = 0; i < strlen( skew ); i++) { k--; sum += (skew[i] - '0') * base[k]; } printf("%d\n",sum); } return 0; }