Решение задачи Системы счисления с Меньшиков

Без пояснения   Просмотров: 122


Дано целое неотрицательное число в I-ричной системе счисления. Вывести это число в J-ричной системе счисления.


Код

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
 
using namespace std;
 
const int max_size = 6000;
int osn = 100;
struct BigInt
{
    int digits[max_size];
    int amount;
    BigInt()
    {
        memset(digits,0,sizeof(digits));
        amount = 1;
    }
    BigInt(int dig)
    {
        memset(digits,0,sizeof(digits));
        amount = 1;
        digits[0] = dig;
    }
};
bool isZero(const BigInt &a)
{
    return a.amount == 1 && a.digits[0] == 0;
}
BigInt operator + (const BigInt &a, const int n)
{
    BigInt res = a;
    int pos = 0;
    res.digits[pos] += n;
    while (res.digits[pos]>=osn)
    {
        res.digits[pos+1]++;
        res.digits[pos++] -= osn;
    }
    if (res.digits[res.amount])
        res.amount++;
    return res;
}
BigInt operator * (const int n, const BigInt &a)
{
    BigInt res;
    res.amount = a.amount;
    int r = 0;
    for (int i=0;i<res.amount || r;i++)
    {
        res.digits[i] = a.digits[i] * n + r;
        r = res.digits[i] / osn;
        res.digits[i] -= r * osn;
    }
    if (res.digits[res.amount])
        res.amount++;
    return res;
}
BigInt operator / (const BigInt &a, const int n)
{
    BigInt res;
    res.amount = a.amount;
    int ost = 0;
    for (int i=a.amount-1;i>=0;i--)
    {
        int cur = ost * osn + a.digits[i];
        res.digits[i] = cur / n;
        ost = cur - res.digits[i] * n;
    }
    int pos = res.amount;
    while (pos !=0 && res.digits[pos] == 0)
        pos--;
    res.amount = pos+1;
    return res;
}
int operator % (const BigInt &a, const int n)
{
    BigInt res;
    int ost = 0;
    for (int i=a.amount-1;i>=0;i--)
    {
        int cur = ost * osn + a.digits[i];
        res.digits[i] = cur / n;
        ost = cur - res.digits[i] * n;
    }
    return ost;
}
string num;
int ii,jj;
void input()
{
    cin>>ii>>jj;
    cin>>num;
}
void output(const vector<int> &mas)
{
    if (mas.size() == 0)
        cout<<0;
    else
    {
        for (int i=mas.size()-1;i>=0;i--)
        {
            if (mas[i] < 10)
                printf("%d", mas[i]);
            else
                printf("%c", 'A' + mas[i] - 10);
        }
    }
}
void solve()
{
    // перевод в 10-ую систему
    BigInt dec(0);
    for (int i=0; i<num.size(); i++)
    {
        int dig = num[i] >= 'A'? num[i] - 'A' + 10 : num[i] - '0';
        dec = ii * dec + dig;
    }
    //перевод в jj-ую систему счисления
    vector<int> res;
    while (!isZero(dec))
    {
        res.push_back(dec % jj);
        dec = dec / jj;
    }
    output(res);
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
   
    input();
    solve();
    return 0;
}

         

Администратор Photo Автор: Администратор




Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться