【學習筆記】程序設計導引及在線實踐 數值轉換問題(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;
}