【學習筆記】程序設計導引及在線實踐 數值轉換問題(2)

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

2147483647

 4 

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;
}


發佈了30 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章