您的位置:首页 > 其它

【学习笔记】程序设计导引及在线实践 数值转换问题(2)

2014-07-20 19:55 239 查看
【学习笔记】程序设计导引及在线实践 数值转换问题(2)相邻数字的基数不等比:skew数

问题描述

在 skew binary 表示中, 第 k 位的值x k 表示x k x(2 k+1 -1)。 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, 10120(skew) = 1x (2 5 -1) + 0x (2 4 -1) + 1x (2 3 -1) + 2x (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

----------------------------------------------------------------------------------------

关键:找到递推关系,存储权值,倒序相乘。

源代码:

#include<iostream>
#include<cstring>
using namespace std;
int main(){
int i,k,base[31],sum;
char skew[32];
base[0]=1;
for(i=1;i<31;i++)
//权值数组base[i]:具有如下递推关系:
//base[0]=1;
//base[k]=2^k+1-1=2*(2^k-1)+1=2*base[k-1]+1
base[i]=2*base[i-1]+1;
while(1){
scanf("%s",skew);
//strcmp的用法说明:
//strcmp(str1,str2)
//如果str1=str2,则返回零;若str1>str2,则返回正数;若str1<str2,则返回负数。
if(strcmp(skew,"0")==0)
//输入skew为0时程序结束
break;
//初始化sum值
sum=0;
//获取skew数组的长度k
k=strlen(skew);
for(i=0;i<strlen(skew);i++){
k--;
//base数组{1,3,7....}权值依次增大即为高位的权值
//因此此处应该倒着调用base的权值
sum+=(skew[i]-'0')*base[k];
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: