蓝桥杯C++基础算法-进制转换
这段代码实现了进制转换的功能,将一个给定的数字从一种进制转换为另一种进制。具体来说,它将一个数字从 n 进制转换为 m 进制。以下是代码的详细思路解析:
1. 问题背景
给定一个数字(以字符串形式表示),其当前进制为 n,目标是将其转换为 m 进制。输入包括:
-
n:当前进制。 -
num:数字(以字符串形式表示)。 -
m:目标进制。
2. 代码逻辑解析
(1) n 进制转换为十进制
int len = num.size();
for (int i = len - 1, k = 0; i >= 0; i--, k++)
{
int tmp;
if (num[i] >= 'A' && num[i] <= 'F')
tmp = num[i] - 'A' + 10;
else
tmp = num[i] - '0';
ten += tmp * pow(n, k);
}
-
功能:将
n进制的数字转换为十进制。 -
逻辑:
-
初始化:
-
len:数字的长度。 -
ten:用于存储十进制结果。
-
-
逐位转换:
-
从最低位到最高位逐位处理数字。
-
如果当前字符是字母(
A到F),将其转换为对应的十进制值(10到15)。 -
如果当前字符是数字(
0到9),直接转换为对应的十进制值。 -
将当前位的值乘以
n的幂(pow(n, k)),并累加到ten中。
-
-
(2) 十进制转换为 m 进制
char result[100];
int index = 0;
while (ten)
{
int u = ten % m;
ten /= m;
char tmp;
if (u < 10)
tmp = u + '0';
else
tmp = u + 'A' - 10;
result[index++] = tmp;
}
-
功能:将十进制数字转换为
m进制。 -
逻辑:
-
初始化:
-
result:用于存储m进制的结果。 -
index:用于记录结果数组的索引。
-
-
逐位转换:
-
使用一个循环,直到
ten为 0。 -
计算当前位的值
u(ten % m)。 -
如果
u小于 10,将其转换为对应的字符('0'到'9')。 -
如果
u大于等于 10,将其转换为对应的字母('A'到'F')。 -
将当前位的字符存储到
result中。
-
-
(3) 输出结果
for (int i = index - 1; i >= 0; i--)
{
cout << result[i];
}
cout << endl;
-
功能:从高位到低位输出结果。
-
逻辑:
-
由于结果数组是从低位到高位存储的,因此需要从数组的末尾开始输出。
-
3. 总结
这段代码的核心思路是通过两次进制转换实现从 n 进制到 m 进制的转换:
-
n 进制转换为十进制:逐位处理数字,将每一位的值乘以
n的幂,累加到结果中。 -
十进制转换为 m 进制:逐位处理十进制数字,将每一位的值存储到结果数组中。
-
输出结果:从高位到低位输出结果数组中的字符。
这种方法适用于处理不同进制之间的转换,时间复杂度为 O(d),其中 d 是数字的位数。
完整代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
string num;
int n, m, ten = 0;
cin >> n >> num >> m;
// 1、n进制转换为十进制
int len = num.size();
for (int i = len - 1, k = 0; i >= 0; i--, k++)
{
int tmp;
if (num[i] >= 'A' && num[i] <= 'F')
tmp = num[i] - 'A' + 10;
else
tmp = num[i] - '0';
ten += tmp * pow(n, k);
}
// 2、十进制转换为m进制,使用数组进行存储
char result[100];
int index = 0;
while (ten)
{
int u = ten % m;
ten /= m;
char tmp;
if (u < 10)
tmp = u + '0';
else
tmp = u + 'A' - 10;
result[index++] = tmp;
}
// 3、输出答案
for (int i = index - 1; i >= 0; i--)
{
cout << result[i];
}
cout << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
更多推荐



所有评论(0)