数的进制转换⭐

题面

编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。

这里有62个不同数位{0-9,A-Z,a-z}。

输入格式

第一行输入一个整数,代表接下来的行数。

接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。

输入进制和输出进制都在2到62的范围之内。

(在十进制下)A = 10,B = 11,…,Z = 35,a = 36,b = 37,…,z = 61 (0-9仍然表示0-9)。

输出格式

对于每一组进制转换,程序的输出都由三行构成。

第一行包含两个数字,首先是输入进制(十进制表示),然后是用输入进制表示的输入数字。

第二行包含两个数字,首先是输出进制(十进制表示),然后是用输出进制表示的输入数字。

第三行为空白行。

同一行内数字用空格隔开。

输入样例:

8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030

输出样例:

62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001

10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2

16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A

35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05

23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj

49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S

61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030

5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890

题解

按照短除法,自己写写画画

string

#include <bits/stdc++.h>
#define all(n) (n).begin(), (n).end()
#define se second
#define fi first
#define pb push_back
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef double db;

int _, n, m;
string s;

void work(int a, int b, string& s)
{
    int len = int(s.size());
    VI cur(len), ans;
    rep(i, 0, len - 1)
        cur[i] = s[i] - (s[i] <= '9' ? 48 : s[i] <= 'Z' ? 64 - 9 : 96 - 35);

    for (int i = 0; i < len;)
    {
        rep (j, i + 1, len - 1)
            cur[j] += cur[j - 1] % b * a, cur[j - 1] /= b;

        ans.pb(cur[len - 1] % m); cur[len - 1] /= m;

        while (i < len && cur[i] == 0) ++i;
    }

    s = "";
    per (i, ans.size() - 1, 0)
        s += char(ans[i] + (ans[i] <= 9 ? 48 : ans[i] <= 35 ? 64 - 9 : 96 - 35));a
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    for (cin >> _; _; --_)a
    {
        cin >> n >> m >> s;
        cout << n << ' ' << s << '\n';
        work(n, m, s);
        cout << m << ' ' << s << '\n' << '\n';
    }
    return 0;
}

char

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;

const int maxn = 1100;

int t[maxn], A[maxn], n, m;
char str1[maxn], str2[maxn];

void solve()
{
    int k=0, len = strlen(str1);
    per(i,len,0)
        t[len-i-1] = str1[i] -(str1[i] < 58 ? 48 : str1[i] < 97 ? 55 : 61);
    while(len)
    {
        per(i,len-1,1)
        {
            t[i-1] += t[i] % m * n;
            t[i] /= m;
        }
        A[k++] = t[0] % m;
        t[0] /= m;
        while(len>0&&!t[len-1]) --len;
    }
    str2[k] =NULL;
    FOR(i,0,k-1)
        str2[k-1-i] = A[i] + (A[i] < 10 ? 48 : A[i] < 36 ? 55 : 61);
}

int main()
{
    int t;
    scanf("%d\n",&t);
    while(t--) 
    {
        scanf("%d %d %s\n", &n, &m, str1);
        solve();
        printf("%d %s\n%d %s\n\n", n, str1, m, str2);
    }
    return 0;
}
posted @ 2020-05-08 16:10  洛绫璃  阅读(530)  评论(0编辑  收藏  举报