PAT乙级(Basic Level)练习题 skew数

题目描述
在 skew binary 表示中,第 k 位的值 x[k] 表示 x[k]×(2(k+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。

输入描述:
输入包括多组数据,每组数据包含一个 skew 数。

输出描述:
对应每一组数据,输出相应的十进制形式。结果不超过 2^31-1。

输入例子:

10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000

输出例子:

44
2147483646
3
2147483647
4
7
1041110737

\color{blue}解题思路:
这道题看起来有点绕,其实很简单,有点类似进制转换的题。
根据题意,第k位的权为x[k]×(2^(k+1)-1),我们只要按权进行展开即可。
示例10120(skew) = 1×(25-1) + 0×(24-1) + 1×(23-1) + 2×(22-1) + 0×(21-1) = 31 + 0 + 7 + 6 + 0 = 44已经很明确了。
比如10120的最高位为‘1’,是第5位(k = 5),带入权公式得1×(25-1)。

\color{blue}代码实现:

#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;

int main(int argc, const char * argv[]) {
    char skewStr[50] = {0};
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%s", skewStr) != - 1) {
        int resNum = 0;
        //从右→左进行扫描,注意i是下标指示器,k是才是第k位
        for (int i = (int)strlen(skewStr) - 1, k = 0; i >= 0; ++k, --i) {
            //转为数值
            int tempNum = skewStr[i] - '0';
            //x[k]×(2^(k+1)-1)(注意这里的i才是数组下标)
            resNum += tempNum * (pow(2, k + 1) - 1);
        }
        printf("%d\n", resNum);
    }
    return 0;
}

在这里插入图片描述

发布了1005 篇原创文章 · 获赞 269 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/104659628
今日推荐