題目簡述
給定一個十進位制數 $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;
}