P1017 进制转换

题目描述

我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减11)为指数,以1010为底数的幂之和的形式。例如:123123可表示为 1 \times 10^2+2\times 10^1+3\times 10^01×102+2×101+3×100这样的形式。

与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1−1)为指数,以22为底数的幂之和的形式。一般说来,任何一个正整数RR或一个负整数-R−R都可以被选来作为一个数制系统的基数。如果是以RR或-R−R为基数,则需要用到的数码为 0,1,....R-10,1,....R−1。例如,当R=7R=7时,所需用到的数码是0,1,2,3,4,50,1,2,3,4,5和66,这与其是RR或-R−R无关。如果作为基数的数绝对值超过1010,则为了表示这些数码,通常使用英文字母来表示那些大于99的数码。例如对1616进制数来说,用AA表示1010,用BB表示1111,用CC表示1212,用DD表示1313,用EE表示1414,用FF表示1515。

在负进制数中是用-R−R作为基数,例如-15−15(十进制)相当于110001110001(-2−2进制),并且它可以被表示为22的幂级数的和数:

110001=1\times (-2)^5+1\times (-2)^4+0\times (-2)^3+0\times (-2)^2+0\times (-2)^1 +1\times (-2)^0110001=1×(−2)5+1×(−2)4+0×(−2)3+0×(−2)2+0×(−2)1+1×(−2)0

设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,...,-20}−R∈−2,−3,−4,...,−20

输入输出格式

输入格式:

输入的每行有两个输入数据。

第一个是十进制数NN (-32768 \le N \le 32767−32768≤N≤32767)
第二个是负进制数的基数-R−R。

输出格式:

结果显示在屏幕上,相对于输入,应输出此负进制数及其基数,若此基数超过1010,则参照1616进制的方式处理。

#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const char nc[20] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
string ans;
int main(){
    int m, n, k, t, s;
    while(cin >> m >> n){
        ans = "";
        s = m;
        while(m != 0){
            k = m % n;
            t = m / n;
            if(k < 0){//如果余数小于0,则表示余数不够用了,要从上一位借1,所以t++(个人理解)
                k -= n;
                t++;
            }
            m = t;
            ans.push_back(nc[k]);
        }
        cout << s << "=";
        for(int i = ans.length() - 1; i >= 0; i--){
            cout << ans[i];
        }
        cout << "(base" << n << ")" << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Endeavor_G/article/details/84344614