数值转换问题(二)相邻数字的基数不等比:skew数

数值转换问题(二)

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

在 skew binary表示中, 第 k 位的值xk表示xk×(2^(k+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、0 = 44. 前十个skew数是 0、1、2、10、
11、12、20、100、101、以及102。
输入数据
输入包含一行或多行,每行包含一个整数n。 如果 n = 0 表示输入结束,否则n是一个skew 数
输出要求
对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 231-1 = 2147483647

代码
#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; // base[i]=2^(i+1)-1=2 *( 2 ^ i -1)+1=2 * b[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;
}
题目分析
(1)skew数的相邻位上,基数之间没有等比关系。计算完每一个基数,再转换为十进制。对于长度为k的skew数,最后一位数字的基数为2^(k-1)。由于转换成十进制后, n 不超过 2^(31-1),因此输入skew数的最大长度不超过31。
(2) 用一个整型数组base[31],依次存储skew数最末位、倒数第2位、……、第31位的基数值。使用这个数组,把每个skew数转换成对应的十进制数。

总结
(1)最后一位是0位,即k=0。所以根据公式带入的时候倒数第5个数实际上是第6位。
(2)**strcmp:**函数比较两个字符串,设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
(3)base[i]=2^(i+1)-1=2 *( 2 ^ i -1)+1=2 * b[i-1]+1
要通过base[k]计算出数值,找出base[i]与base[i-1]的关系,通过数学计算找出关系。
但是直接用2^(i+1)-1计算出结果错误,实在不知为什么不对。

猜你喜欢

转载自blog.csdn.net/m0_45128748/article/details/91350431