全面 正进制数转化 函数模板(直接调用)

本题链接:用户登录

题目:

样例:

输入
2
2 10 
10101 
11 2
1793A5068

输出
21
10101111001010100111010101011

思路:

        对于进制数之间的转化,我们可以通过 以 十进制作为桥梁 进行进制数之间的转化

比如: 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;
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值