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

本文介绍了一种特殊的数制——Skew数,并提供了一种将其转换为十进制的方法。通过预先计算基数,文章给出了一段C语言代码,能够高效地完成转换过程。

问题定义:

在 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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值