ACM-skew數(數制轉化問題)

問題描述


輸入數據

輸入包含一行或多行,每行包含一個整數 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;
}
發佈了80 篇原創文章 · 獲贊 34 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章