P1017 [NOIP2000 提高組] 進位制轉換 題解

zhuluoan發表於2024-05-01

題目簡述

給定一個十進位制數 $n$,將其轉換成一個 $-R$ 進位制數。

題目分析

十進位制數轉負進位制,同樣可以使用短除取餘法,但是會出現餘數為負的情況,例如 $-11 \div -2 = 5 ~\cdots \cdots -1$,此時我們可以用如下法方解決此問題:

我們設被除數為 $a$,除數為 $b$,餘數為 $c$,商為 $d$,其中 $c<0$ 且 $b<0$。

由除法的定義可知 $a=b \times d +c$,所以有 $a=b \times (d+1)+c-b$,由於餘數小於被除數,所以有 $c \lt b$,又因為 $c<0$ 且 $b<0$,所以新的餘數 $c-b > 0$。

所以我們只需要將商加 $1$,餘數減除數,即可解決餘數為負的情況。

程式碼

#include<iostream>
#include<stack>
using namespace std;
int n,R;
stack<char> s;
int main()
{
	cin>>n>>R;
	cout<<n<<"=";
	while(n)
	{
		int yu=n%R;
		n/=R;
		if(yu<0) n++,yu-=R;
		s.push(char(yu>9?yu+55:yu+'0'));
	}
	while(!s.empty())
	{
		cout<<s.top();
		s.pop();
	}
	cout<<"(base"<<R<<")";
	return 0;
} 

相關文章