タイトルポータル
質問の主なアイデア:
10進数n(0未満の場合があります)を指定し、r-numberに変換させます(rは0未満の場合もあります)。
nとrの両方が0より大きい場合、短い除算によって各ビットを直接保存することをお勧めします。
短い部門
int cnt=0;
while(n)
{
a[cnt++]=n%r;
n/=r;
}
ただし、ここではこれを行うことはできません。負の数を法とすると、-15%-2 ==-1、-15 / -2 == 7のように、負の数になる可能性があるためです。剰余を正の16進数にするには、被除数をn、除数をr、商をs、剰余をmとします。
次に、n = s * r + mがあります。mが0未満の場合、剰余を正にするために必要なのは(+/-)rだけです。同時に、sも変更する必要があります。具体的な加算と減算については、rを参照してください。シンボル。
ここではrを負と見なしています。剰余を正に変更したい場合は、rを1つ減算して新しい商をxに設定し、n = x * r +(mr)とすると、x rr = s r ; x = s + 1です。
コードオン
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
const int eps=1e-6;
typedef long long ll;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
//#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
void add(string &s,int tt)
{
if(tt<10)
s+=tt+'0';
else
s+=tt-10+'A';
}
signed main()
{
IOS;
int n,r;
cin>>n>>r;
string s;
int m=n;
while(n)
{
if(n%r<0)
{
int tt=n%r-r;
add(s,tt);
n=n/r+1;
}
else
{
add(s,n%r);
n/=r;
}
}
reverse(s.begin(),s.end());
cout<<m<<'=';
for(int i=0;i<s.size();i++)
cout<<s[i];
cout<<"(base"<<r<<')';
}