南沙C++信奧賽陳老師解一本通題 1820:【00NOIP提高組】進位制轉換

南沙区信奥赛陈老师發表於2024-10-02

【題目描述】

我們可以用這樣的方式來表示一個十進位制數:將每個阿拉伯數字乘以一個以該數字所 處位置的(值減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進位制的方式處理。

【輸入樣例】

30000 -2
-20000 -2
28800 -16
-25000 -16

【輸出樣例】

1101101010111000
1111011000100000
19180
7FB8

#include <iostream>
using namespace std;
int a[1000];
void ToBinarySystem(int n,int r)
{
	int cnt=1;
	while(n)		
	{
		int remain=n%r; 
		n/=r;
		if(remain<0) //餘數不能小於0 
		{
			remain+=abs(r); //如果餘數小於0,加上被除數絕對值 同時商++ 
			n++;	
		}	
		a[cnt++]=remain;
	}
	for(int i=cnt-1;i>=1;i--)
	{
		if(a[i]<10)	
			cout<<a[i];
		else
			cout<<(char)('A'+a[i]-10);
	}
		
	cout<<endl;
}
int main()
{
	int n,r;
	while(cin>>n>>r)
		ToBinarySystem(n,r);
	return 0;
}
南沙C++信奧賽陳老師解一本通題 1820:【00NOIP提高組】進位制轉換

相關文章