ACM-skew数(数制转化问题)

来源:互联网 发布:java io 实现断点续传 编辑:程序博客网 时间:2024/05/17 23:33

问题描述


输入数据

输入包含一行或多行,每行包含一个整数 n。 如果 n = 0 表示输入结束,否则 n 是一个 skew 数

输出要求

对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 2的31次-1(2147483647)

输入样例

1012020000000000000000000000000000010100000000000000000000000000000011100111110000011100001011011020000

输出样例

44214748364632147483647471041110737

解题思路

        skew 数的相邻位上,基数之间没有等比关系。计算每一位的基数后,再把一个 skew 数转换成十进制表示就很简单。对于长度为 k 的 skew 数,最后一位数字的基数为 2的k次-1。由于转换成十进制后, n 不超过 2的3次1-1,因此输入 skew 数的最大长度不超过 31。
       用一个整型数组 base[31],依次存储 skew 数最末位、倒数第 2 位、 …..、第 31 位的基数值。使用这个数组,把每个 skew 数转换成对应的十进制数。

base[0] = 1base[k] = 2的(k+1)次 - 1 = 2 * (2的k次 - 1) + 1 = 2 * base[k -1] + 1

参考程序

#include <iostream>#include <cstring> using namespace std;int main(){int i,k,base[31],sum;char skew[32];for(i=1;i<31;i++){base[i]=2*base[i-1]+1;//计算每一位的基数} while(true){cin>>skew;if(strcmp(skew,"0") == 0){break;}sum = 0;k = strlen(skew);for(i=0;i<strlen(skew);i++){k--;//把每个 skew 数转换成对应的十进制数sum += (skew[i]-'0')*base[k];}cout<<sum<<endl;}return 0;}

0 0
原创粉丝点击