本题链接:用户登录
|
|
? ? ? ? 对于进制数之间的转化,我们可以通过 以 十进制作为桥梁 进行进制数之间的转化
比如: Q 进制 转化为? K 进制
我们可以分为两个部分? ? Q 进制转化为 十进制? ? ? ,? ?十进制转化为? K 进制
这样就可以达到效果 为? ?Q 进制转化为? K 进制
废话不多说,具体原理代码函数模板如下:
inline string to_kbit(string &x,int &bit,int &nbit)
{
int num = 0; // 存储转化为 十进制的数值
if(bit != 10) // 如果不是十进制的数值,这开始转化为十进制的数值
{
int len = x.size();
for(int i = 0;i < len;++i)
{
int have = x[i];
if(isupper(have)) have = have - 'A' + 10;
else have -= '0';
num = num * bit + have;
}
bit = 10;
}else num = stoll(x); // 如果是十进制的数值我们先转化为 int 型,方便我们转化为 nbit 进制的数值
if(bit == nbit) return to_string(num);
string ans = ""; // 存储转化为 nbit 进制的结果数值
do
{
int temp = num % nbit;
num /= nbit;
ans += (temp >= 10 ? temp + 'A' - 10: temp + '0');
}while(num);
reverse(ans.begin(),ans.end());
return ans;
}
#include <iostream>
#include <algorithm>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
inline string to_kbit(string &x,int &bit,int &nbit)
{
int num = 0; // 存储转化为 十进制的数值
if(bit != 10) // 如果不是十进制的数值,这开始转化为十进制的数值
{
int len = x.size();
for(int i = 0;i < len;++i)
{
int have = x[i];
if(isupper(have)) have = have - 'A' + 10;
else have -= '0';
num = num * bit + have;
}
bit = 10;
}else num = stoll(x); // 如果是十进制的数值我们先转化为 int 型,方便我们转化为 nbit 进制的数值
if(bit == nbit) return to_string(num);
string ans = ""; // 存储转化为 nbit 进制的结果数值
do
{
int temp = num % nbit;
num /= nbit;
ans += (temp >= 10 ? temp + 'A' - 10: temp + '0');
}while(num);
reverse(ans.begin(),ans.end());
return ans;
}
signed main()
{
// freopen("a.txt","r",stdin);
IOS;
int _T;
cin >> _T;
while(_T--)
{
string s;
int bit,nbit;
cin >> bit >> nbit >> s;
string ans = to_kbit(s,bit,nbit);
cout << ans << endl;
}
return 0;
}
最后再给一个,大整数的情况下的进制数转化:
可能会超时,但是还是挺好玩的。
inline string to_kbit(string now_x,int bit,int nbit)
{
// 字符串 大整数 加法模板
auto ADD = [](string s1,string s2)->string
{
vector<int>a,b,c;
string ans = "";
int alen = s1.size(),blen = s2.size();
for(int i = alen - 1;i > -1;--i) a.emplace_back(s1[i] - '0');
for(int i = blen - 1;i > -1;--i) b.emplace_back(s2[i] - '0');
int t = 0;
for(int i = 0;i < alen || i < blen;++i)
{
if(i < alen) t += a[i];
if(i < blen) t += b[i];
c.emplace_back(t % 10);
t /= 10;
}
if(t) c.emplace_back(1);
int clen = c.size();
for(int i = clen - 1;i > -1;--i)
{
ans += (char)(c[i] + '0');
}
return ans;
};
// 大整数除法模板
auto Div = [](string s1,int b,int &r)->string
{
vector<int>a,c;
string ans = "";
int alen = s1.size();
for(int i = 0;i < alen;++i) a.emplace_back(s1[i] - '0');
r = 0;
for(int i = 0;i < alen;++i)
{
r = r * 10 + a[i];
c.emplace_back(r / b);
r %= b;
}
reverse(c.begin(),c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();
int clen = c.size();
for(int i = clen - 1;i > -1;--i) ans += (c[i] + '0');
return ans;
};
string nx = "";
if(bit != 10)
{
string x = "0";
int product = 1;
int idx = now_x.size() - 1;
while(idx >= 0)
{
int have = now_x[idx--];
if(isupper(have)) have = have - 'A' + 10;
else have = have - '0';
x = ADD(x,to_string(have*product));
product *= bit;
}
now_x = x;
}
do
{
int r = 0;
now_x = Div(now_x,nbit,r);
nx += char(r >= 10 ? 'A' + r-10 : r + '0');
}while(now_x != "0");
reverse(nx.begin(),nx.end());
return nx;
}