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


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

原创 于 2024-01-05 15:42:38 发布 · 粉丝可见 · 479 阅读 · 10 · 8 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/135410390

本题链接: 用户登录

题目:

样例:

cobol<br/>2<br/>2 10 <br/>10101 <br/>11 2<br/>1793A5068<br/>
cobol<br/>21<br/>10101111001010100111010101011<br/>

思路:

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

比如: Q 进制 转化为  K 进制

我们可以分为两个部分    Q 进制转化为 十进制      ,   十进制转化为  K 进制

这样就可以达到效果 为   Q 进制转化为  K 进制

废话不多说,具体原理代码函数模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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;
}

最后提交:

最后再给一个,大整数的情况下的进制数转化:

可能会超时,但是还是挺好玩的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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;
}

觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭

微信二维码

wechat pay

支付宝二维码

ali pay

全面 正进制数转化 函数模板(直接调用)
http://blog.angindem.cn/2024/01/05/Angindem-CSDN博客/118_118/
作者
Angindem
发布于
2024年1月5日
许可协议