skew数

来源:互联网 发布:java jvm调优 编辑:程序博客网 时间:2024/05/17 02:56


1. skew数(相邻数字的技术不成等比)

问题描述

在 skew binary 表示中, 第 k 位的值 x k 表示 x k (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、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 不超过 2 31 -1,因此输入 skew 数的最大长度不超过 31。(char  stew[32];)
用一个整型数组 base[31],依次存储 skew 数最末位、倒数第 2 位、…..、第 31 位的基

数值。使用这个数组,把每个 skew 数转换成对应的十进制数。



2. 我的思考:和上一题类似……

我的代码:

 #include <stdio.h>  #include <string.h> long b2ten(char* x, int b) { int ret =0; int sum = 0; int len = strlen(x); for (int i = 0; i < len; i++) {      ret *= b;ret += x[i]-'0' ;  } ret *= 2; for(int i=0;i<len;i++) { sum += x[i]-'0'; } ret =ret-sum; return (long)ret; }int main() { char stew[32];  long s; while(1) { scanf("%s",stew); s = b2ten(stew,2);  printf("%d\n",s); }   } 

3.  答案代码:

答案的关键在于:寻找到了不同位数的基数的关系,找到了递推表达式!


#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(strcpy(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 0
原创粉丝点击