(来源:poj.grids.cn 2973,程序设计导引及在线实践(李文新)例3.2 P101)
问题描述:
在skew binary表示中,第k位的值xk表示xk*(2k+1-1) 。每个位上的可能数字是0或1,最后面一个非零位可以是2,例如,10120(skew) = 1*(25-1) + 0*(24-1) + 1*(23-1) + 2*(22-1) +0*(21-1) = 31 + 0 + 7 + 6 + 0 = 44. 前十个skew 数是 0、1、2、10、11、12、20、100、101以及102。
输入:
输入包含一行或多行,每行包含一个整数n。如果n = 0 表示输入结束,否则n 是一个skew 数。
输出:
对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 231-1 = 2 147 483 647。
输入样例:
10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0
输出样例:
44
2147483646
3
2147483647
4
7
1041110737
解题思路1:
skew 数的相邻位上,基数之间没有等比关系。计算每一位的基数后,再把一个skew 数转换成十进制表示就很简单。对于长度为k 的skew 数,最后一位数字的基数为2k-1。由于转换成十进制后, n不超过 231-1,因此输入skew 数的最大长度不超过31。
用一个整型数组base[31],依次存储skew数最末位、倒数第2 位、…..、第31 位的基数值。使用这个数组,把每个skew 数转换成对应的十进制数。
base[0]= 1
base[k] = 2k+1 - 1 = 2 * (2k - 1) +1 = 2 * base[k -1] + 1
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int base[31];
int i,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);
sum=0;
if (strcmp(skew,"0")==0)
break;
int len=strlen(skew);
for (i = 0; i < len; ++i)
{
sum+=(skew[i]-'0')*base[len-i-1];
}
printf("%d\n",sum );
}
return 0;
}