2025-12-13:十六进制和三十六进制转化。用go语言,给定一个整数 n,先求它的平方并把该值用大写字母的 16 进制表示(

举报
福大大架构师每日一题 发表于 2025/12/13 06:45:20 2025/12/13
【摘要】 2025-12-13:十六进制和三十六进制转化。用go语言,给定一个整数 n,先求它的平方并把该值用大写字母的 16 进制表示(符号位按需处理,数位使用 0–9 与 A–F),再求它的立方并将该值用大写字母的 36 进制表示(数位使用 0–9 与 A–Z)。最后将这两个进制字符串按顺序拼接,作为函数的返回结果。1 <= n <= 1000。输入:n = 13。输出: “A91P1”。解释:n...

2025-12-13:十六进制和三十六进制转化。用go语言,给定一个整数 n,先求它的平方并把该值用大写字母的 16 进制表示(符号位按需处理,数位使用 0–9 与 A–F),再求它的立方并将该值用大写字母的 36 进制表示(数位使用 0–9 与 A–Z)。

最后将这两个进制字符串按顺序拼接,作为函数的返回结果。

1 <= n <= 1000。

输入:n = 13。

输出: “A91P1”。

解释:

n * n = 13 * 13 = 169。在十六进制中,它转换为 (10 * 16) + 9 = 169,对应于 “A9”。

n * n * n = 13 * 13 * 13 = 2197。在三十六进制中,它转换为 (1 * 362) + (25 * 36) + 1 = 2197,对应于 “1P1”。

连接两个结果得到 “A9” + “1P1” = “A91P1”。

题目来自力扣3602。

分步过程描述

  1. 给定整数 n = 13
    计算它的平方:
    ( n^2 = 13 \times 13 = 169 )

  2. 平方值转换为十六进制

    • 调用 toRadix(169, 16)
    • 169 除以 16 的商和余数依次是:
      • 169 ÷ 16 = 10 余 9
      • 10 ÷ 16 = 0 余 10
    • 余数映射到十六进制字符:9 → ‘9’,10 → ‘A’
    • 余数收集的顺序是从低位到高位(9, 10),即 “9A”,但最后要反转,所以得到 “A9”。
  3. 计算立方
    ( n^3 = 13 \times 13 \times 13 = 2197 )

  4. 立方值转换为三十六进制

    • 调用 toRadix(2197, 36)
    • 2197 除以 36 的步骤:
      • 2197 ÷ 36 = 61 余 1
        • 余数 1 → ‘1’
      • 61 ÷ 36 = 1 余 25
        • 余数 25 → ‘Z’?不对,要检查字母映射:
          余数 0–9 → ‘0’–‘9’,余数 10 → ‘A’,余数 11 → ‘B’,…,余数 25 → 10+15 = 第 16 个字母? 10→A(0), 11→B(1), …, 25 是 10+15,所以余数 25 是 10(A)+15 = 第 16 个字母是 P。
          验证:余数 10 → ‘A’,11 → ‘B’,12 → ‘C’,…,25 → ‘A’ + 15 = ‘P’ ✅
      • 1 ÷ 36 = 0 余 1
        • 余数 1 → ‘1’
    • 从低位到高位余数为 1, 25, 1,反转后是 1, 25, 1 → 字符 ‘1’, ‘P’, ‘1’ → 字符串 “1P1”。
  5. 拼接结果

    • 十六进制部分 “A9” + 三十六进制部分 “1P1” → “A91P1”

复杂度分析

假设 ( n ) 给定,平方和立方计算是 ( O(1) )。

  • 进制转换时,循环次数取决于数字在相应进制下的位数,最坏情况出现在 ( n = 1000 ):
    • 平方最大是 ( 10^6 ),十六进制下约 5 位。
    • 立方最大是 ( 10^9 ),三十六进制下约 6 位。
    • 每次循环是常数时间操作。

时间复杂度
每次转换的位数是 ( O(\log M) ),这里 M 是 ( n^2 ) 或 ( n^3 )。由于输入 n ≤ 1000,位数不超过常数范围,所以可视为 ( O(1) )。但通常按大 O 表示法,是 ( O(\log n) )。

空间复杂度
主要是 strings.Builder 存储的字符串长度,以及反转时用的 []rune 临时空间。额外空间与结果字符串长度成线性,结果字符串长度是 ( O(\log n) )。

结论

  • 总时间复杂度:( O(\log n) )(但 n ≤ 1000 时可看作 ( O(1) ))
  • 总额外空间复杂度:( O(\log n) )(存储转换结果所需空间)

Go完整代码如下:

package main

import (
	"fmt"
	"strings"
)

func concatHex36(n int) string {
	h := n * n
	ans := toRadix(h, 16)

	h = n * n * n
	ans += toRadix(h, 36)

	return ans
}

func toRadix(num, radix int) string {
	if num == 0 {
		return "0"
	}

	var builder strings.Builder
	for num > 0 {
		rem := num % radix
		var ch byte
		if rem < 10 {
			ch = byte('0' + rem)
		} else {
			ch = byte('A' + rem - 10)
		}
		builder.WriteByte(ch)
		num /= radix
	}

	// 反转字符串
	runes := []rune(builder.String())
	for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}

	return string(runes)
}

func main() {
	n := 13
	result := concatHex36(n)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def to_radix(num: int, radix: int) -> str:
    """将十进制整数转换为指定进制的字符串表示"""
    if num == 0:
        return "0"
    
    digits = []
    while num > 0:
        rem = num % radix
        if rem < 10:
            digits.append(chr(ord('0') + rem))
        else:
            digits.append(chr(ord('A') + rem - 10))
        num //= radix
    
    return ''.join(reversed(digits))

def concat_hex36(n: int) -> str:
    """返回 n^2 的十六进制字符串与 n^3 的三十六进制字符串的拼接"""
    h = n * n
    ans = to_radix(h, 16)
    
    h = n * n * n
    ans += to_radix(h, 36)
    
    return ans

def main():
    n = 13
    result = concat_hex36(n)
    print(result)

if __name__ == "__main__":
    main()

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <string>

std::string to_radix_no_reverse(int num, int radix) {
    if (num == 0) return "0";

    // 计算最大可能位数
    int temp = num;
    int digits = 0;
    while (temp > 0) {
        temp /= radix;
        digits++;
    }

    // 从最高位开始构建
    std::string result(digits, '\0');
    for (int i = digits - 1; i >= 0; --i) {
        int rem = num % radix;
        result[i] = (rem < 10) ? ('0' + rem) : ('A' + rem - 10);
        num /= radix;
    }

    return result;
}

int main() {
    int n = 13;
    std::string hex_part = to_radix_no_reverse(n * n, 16);
    std::string base36_part = to_radix_no_reverse(n * n * n, 36);
    std::cout << hex_part + base36_part << std::endl;

    return 0;
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。