本题链接:用户登录
题目:
 
样例:
   | 
   | 

思路:
对于进制数之间的转化,我们可以通过 以 十进制作为桥梁 进行进制数之间的转化
比如: 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;
} 
AC代码如下:
#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;
}
                


















![[附代码]稳态视觉诱发电位SSVEP之预训练模型提高性能](https://img-blog.csdnimg.cn/direct/83410fbabed14b749070145f6bde0dc6.png)