skew数

(来源: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值