NOIP2000提高組 進制轉換

NOIP2000提高組 進制轉換

題目描述

    我們可以用這樣的方式來表示一個十進制數: 將每個阿拉伯數字乘以一個以該數字所處位置的(值減1)爲指數,以10爲底數的冪之和的形式。例如:123可表示爲 1*10^2+2*10^1+3*10^0​​ 這樣的形式。
    與之相似的,對二進制數來說,也可表示成每個二進制數碼乘以一個以該數字所處位置的(值-1)爲指數,以2爲底數的冪之和的形式。一般說來,任何一個正整數R或一個負整數-R都可以被選來作爲一個數制系統的基數。如果是以R或-R爲基數,則需要用到的數碼爲 0,1,....R-1。例如,當R=7時,所需用到的數碼是0,1,2,3,4,5和6,這與其是R或-R無關。如果作爲基數的數絕對值超過10,則爲了表示這些數碼,通常使用英文字母來表示那些大於9的數碼。例如對16進制數來說,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。
    在負進制數中是用-R 作爲基數,例如-15(十進制)相當於110001(-2進制),並且它可以被表示爲2的冪級數的和數:
    110001=1*(-2)^5+1*(-2)^4+0*(-2)^3+0*(-2)^2+0*(-2)^1 +1*(-2)^0​​ 
    設計一個程序,讀入一個十進制數和一個負進制數的基數, 並將此十進制數轉換爲此負進制下的數:-R∈{-2,-3,-4,...,-20}

輸入輸出格式

    輸入格式:

    輸入的每行有兩個輸入數據。
    第一個是十進制數N(-32768<=N<=32767); 第二個是負進制數的基數-R。

    輸出格式:

    結果顯示在屏幕上,相對於輸入,應輸出此負進制數及其基數,若此基數超過10,則參照16進制的方式處理。

輸入輸出樣例

    輸入樣例1:

    30000 -2

    輸出樣例1:

    30000=11011010101110000(base-2)

    輸入樣例2:

    -25000 -16

    輸出樣例2:

    -25000=7FB8(base-16)

解題分析:

    可以模仿整數進制的做法。但當n爲負數是,對r取餘的結果k爲負數,不符合要求,因此必須向後面的借一個r,將k變爲k-r,同時將n的對r的取餘值加1,即:
    k = n%r;
    n = n/r;
    if(k<0){
        k -= r;
        n++;
    }
    這裏得到的k就是其中一個係數,其他程序略。

    下面的程序採用回溯法,即對每一個係數的可能情況(0, 1, ..., abs(r)-1)進行枚舉,如果計算結果與n相同,則得到結果。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
int n, r, x[20] = {0}, bits;
char bit[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int pow2(int n, int e){
	int ans = 1, tmp;
	if(n==0)
		return 1;
	else if(n==1)
		return e;
	if(n%2){
		tmp = pow2(n/2, e);
		return e*tmp*tmp;
	} else {
		tmp = pow2(n/2, e);
		return tmp*tmp;
	}		
}
int max_len(){
	int i = 0;
	while(1){
		if(pow2(i, abs(r))> abs(n))
			return i+1;
		i++;
	}
}
void dfs(int k, int m){
	int i, j;
	if(m==n){
		for(i=bits; i>=0; i--)
			if(x[i]!=0)
				break;
		cout<=0; j--)
			cout<>n>>r;
	bits = max_len();
	dfs(0, 0);	
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章