37进制与映射 | 豆包MarsCode AI 刷题

75 阅读4分钟

小M的37进制数字相乘问题 — 学习笔记

题目分析

题目要求我们计算两个37进制数字的乘积,并将结果以37进制表示。37进制使用的字符集是: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 其中,字符依次表示从0到36的数字。在37进制中,字符集的排序和传统的十进制、十六进制不同。我们需要将输入的两个数字(字符串形式)转换成十进制数字,进行乘法运算,再将结果转换回37进制表示。

解体思路

1.字符与数字的映射关系:首先,我们需要了解37进制中字符和数字之间的映射关系。字符 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 对应的数字从0到36。对于任意一个37进制数字字符,我们可以通过映射表将其转换为对应的数字。 2.字符串转换为十进制:接着,我们要将两个37进制数字字符串分别转换为十进制数字。这可以通过累加的方式实现。例如,"Z" 对应数字 35,在37进制中,可以将 "Z" 视作35^0×37^0 =35;而 "AB" 需要按位置权重依次计算。 3.乘法运算:将两个转换后的十进制数字相乘。 4.结果转换回37进制:最后,我们需要将乘积转换回37进制。这个过程类似于将十进制数转换为其他进制的方式。通过对37进行取余和整除操作,我们可以得到每一位的37进制字符,并最终拼接成结果字符串。

详细步骤

步骤1:字符与数字的映射关系 我们可以定义一个映射表,将字符 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 映射到对应的数字。通过这个映射表,可以方便地进行字符到数字的转换和数字到字符的转换。 步骤2:将37进制字符串转换为十进制 将37进制字符串转换为十进制数字时,我们可以利用多项式展开的方式。对于字符串 "AB",其在37进制下的值可以表示为: value=A×37 1 +B×37 0 其中,A 和 B 分别是字符 'A' 和 'B' 对应的数字(分别是10和11),37是进制数。 步骤3:乘法运算 将两个字符串转换为十进制数后,直接进行乘法运算。 步骤4:将十进制结果转换为37进制 为了将十进制数字转换为37进制,我们可以使用除法和取余的方法。每次用数字除以37,得到的余数即为当前位的37进制数。将这些余数按从低位到高位的顺序排列,得到最终的37进制结果。 步骤5:输出结果 最终的结果是一个37进制的数字字符串,我们将其输出即可。

代码实现

`#include #include #include #include <unordered_map>

using namespace std;

// 37进制字符集 const string base37 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$";

// 将字符转为数字 int charToNum(char c) { return base37.find(c); // 通过查找字符在base37中的位置,得到对应的数字 }

// 将十进制数字转为37进制字符串 string numToBase37(int num) { if (num == 0) return "0"; // 特殊情况:0的37进制表示就是"0" string result = ""; while (num > 0) { result += base37[num % 37]; // 取余得到当前位的字符 num /= 37; // 整除得到剩余部分 } reverse(result.begin(), result.end()); // 结果是从低位到高位计算的,反转得到正确顺序 return result; }

int solution(const string& a, const string& b) { // 将37进制的字符串a和b转换为十进制数 int numA = 0, numB = 0;

// 从左到右遍历a,将其转为十进制
for (char c : a) {
    numA = numA * 37 + charToNum(c);  // 按37进制累加
}

// 从左到右遍历b,将其转为十进制
for (char c : b) {
    numB = numB * 37 + charToNum(c);  // 按37进制累加
}

// 计算乘积
int result = numA * numB;

// 将结果转换回37进制
return result;

}

int main() { string a1 = "Z", b1 = "X"; // 测试样例1 string a2 = "A", b2 = "B"; // 测试样例2 cout << numToBase37(solution(a1, b1)) << endl; // 输出:V8 cout << numToBase37(solution(a2, b2)) << endl; // 输出:2$ return 0; } `

charToNum函数:该函数将37进制的字符(例如 "A"、"B" 等)转换为对应的数字。我们通过查找字符在 base37 字符串中的位置来获得数字。 numToBase37函数:这个函数将十进制数字转换为37进制字符串。通过不断将数字除以37,并将余数对应到37进制字符集,最终拼接出结果。 solution函数:主要的逻辑部分,首先将两个37进制数字转换为十进制数字,然后计算它们的乘积,最后返回结果。 main函数:通过样例调用 solution 函数,并将结果转为37进制输出。

题目总结

这道题目其实考察了进制转换的基础知识,并通过实现字符串到数字、数字到字符串的双向转换,展示了如何处理非标准进制(在这里是37进制)。我们通过贪心的方式一步步进行转换,最终求解出结果。

个人思考

通过这道题,我巩固了进制转换的思想,尤其是如何在不同进制之间进行转换。解决这种问题时,我们常常需要将高效的映射方法与迭代计算结合,这对于提升代码的可读性和效率都非常有帮助。同时,也让我们更深入理解了如何灵活运用除法和余数来处理数字转换。 此外,题目中的字符集不常见,这需要我们自定义映射表进行查找,考察了我们对字符处理和字符串操作的掌握。