问题描述
在 skew binary 表示中,第k位的值Xk X (2^(k+1)-1)。每个位上的可能数字是0或1,最后一个非零位可以是2,例如,10 120(skew) = 1X(2^5 -1) + 0X(2^4 -1) + 1X(2^3 -1) + 2X(2^2 -1) + 0X(2^1 -1) = 31+0+7+6+0=44。前10个skew数是0、1、2、10、11、12、20、100、101以及102。输入数据
输入包含一行或多行,每行包含一个整数n。如果n=0,表示输入结束,否则n是一个skew数。输出要求
对于每一个输入,输出它的十进制表示。转换成十进制后,n不超过2^31 - 1 = 2 147 483 647。输入样例
10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0输出样例
44
2147483646
3
2147483647
4
7
1041110737- 解题思路
skew数的相邻位上基数之间没有等比关系。计算每一位的基数后,再把一个skew数转换成十进制表示就很简单。对于长度为k的skew数,最后一位数字的基数为2^k-1。由于转换成十进制后,n不超过2^31-1,因此输入skew数的最大长度不超过31。
用一个整型数组base[31],依次存储skew数最末位、倒数第二位、……、第31位的基数值。使用这个数组,把每个skew数转换成对应的十进制数。
- 解题思路
参考程序
#include<stdio.h>
#include<string.h>
int main()
{
int i,k,base[31],sum;
char skew[32];
base[0] = 1;
for(i = 1; i < 31; i++)
base[i] = 2 * base[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;
}