您的位置:首页 > 其它

相邻数字的基数不等比:skew 数

2016-06-15 06:40 375 查看
问题描述

在 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: