問題描述
輸入數據
輸入包含一行或多行,每行包含一個整數 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的3次1-1,因此輸入 skew 數的最大長度不超過 31。
用一個整型數組 base[31],依次存儲 skew 數最末位、倒數第 2 位、 …..、第 31 位的基數值。使用這個數組,把每個 skew 數轉換成對應的十進制數。
base[0] = 1
base[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;
}