16進変換(正、負)

タイトルポータル

質問の主なアイデア:
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<<')';
}

公開された93元の記事 ウォンの賞賛9 ビュー4203

おすすめ

転載: blog.csdn.net/Joker_He/article/details/104784349