Hailin Code - 基础
type: channel
link: https://lincodex.cn/index.php/tag/basic/
items: 子集 / 全排列
items: 埃拉托斯特尼筛法
items: 进制转换

子集 / 全排列
type: item
date: 2026-03-27T12:55:21+08:00
description: 子集子集 Python 算法nums = list(map(int, input().split())) n = len(nums) res = [] def dfs(start, path): res.append(path.copy()) for i in range(start, n): path.append(i) dfs(i + 1, path) path.pop() dfs(0, []) print(res)全排列 Python 算法# vis 法 nums = list(map(int, input().split())) n = len(nums) vis = [False] * n res = [] def dfs(path:list[int]): if len(path) == n: res.append(path[:]) return for i in range(n): if not vis[i]: vis[i] = True path.append(nums[i]) dfs(path) vis[i] = False path.pop() dfs([]) print(res)# 交换法 def permute(nums): res = [] def dfs(start): if start == len(nums): res.append(nums[:]) return for i in range(start, len(nums)): nums[start], nums[i] = nums[i], nums[start] dfs(start + 1) nums[start], nums[i] = nums[i], nums[start] dfs(0) return res print(permute([1, 2, 3]))

埃拉托斯特尼筛法
type: item
date: 2026-03-22T14:02:00+08:00
description: 埃拉托斯特尼筛法简介埃拉托斯特尼筛法（Sieve of Eratosthenes）是一种简单且古老的算法，用于找出一定范围内所有的素数。其核心思想是从最小的素数开始，逐步标记其倍数为合数，最终未被标记的数即为素数。算法步骤创建一个布尔数组 is_prime[0..n]，初始全部设为 True。将 0 和 1 标记为 False，因为它们不是素数。从 i = 2 开始，若 i 是素数，则将其所有倍数（从 i*i 开始）标记为 False。优化：只需遍历到 sqrt(n)，因为大于 sqrt(n) 的倍数会被更小的素数覆盖。最后，收集所有仍为 True 的索引，即为素数。时间复杂度时间复杂度：O(n log log n)，非常接近线性。空间复杂度：O(n)，用于存储布尔数组。Python 实现def sieve_of_eratosthenes(n): if n < 2: return [] is_prime = [True] * (n + 1) is_prime[0] = is_prime[1] = False limit = int(n ** 0.5) + 1 for i in range(2, limit): if is_prime[i]: for j in range(i * i, n + 1, i): is_prime[j] = False primes = [x for x in range(2, n + 1) if is_prime[x]] return primes切片复制def sieve_of_eratosthenes(n): if n < 2: return [] is_prime = [True] * (n + 1) is_prime[0] = is_prime[1] = False limit = int(n ** 0.5) + 1 for i in range(2, limit): if is_prime[i]: is_prime[i*i::i] = [False] * len(is_prime[i*i::i]) prime = [x for x in range(2, n + 1) if is_prime[x]] return prime

进制转换
type: item
date: 2026-03-20T13:50:00+08:00
description: 十进制 --> 其他进制转二进制：def to_bin(n): """ 将十进制整数转换为二进制字符串表示 参数: n (int): 待转换的十进制整数，必须为非负整数 返回: str: 对应的二进制字符串，不包含前缀 """ if n == 0: return '0' res = '' while n > 0: res = str(n % 2) + res n //= 2 return res转八进制：def to_oct(n): """ 将十进制整数转换为八进制字符串表示 参数: n (int): 待转换的十进制整数，必须为非负整数 返回: str: 对应的八进制字符串，不包含前缀 """ if n == 0: return '0' res = '' while n > 0: res = str(n % 8) + res n //= 8 return res转十六进制：def to_hex(n): """ 将十进制整数转换为十六进制字符串表示 参数: n (int): 待转换的十进制整数，必须为非负整数 返回: str: 对应的十六进制字符串，使用大写字母 A-F，不包含前缀 """ if n == 0: return '0' digits = '0123456789ABCDEF' res = '' while n > 0: res = digits[n % 16] + res n //= 16 return res不难发现其中的规律，我们对n取余加在结果前面，再对n进行整除，因此我们可以设计一个通用进制转换函数，但仅限十六进制以内（含）十进制转任意进制（≤ 16）：def to_base(n, base): """将十进制数n转换为base进制（2 ≤ base ≤ 16）""" if n == 0: return "0" digits = "0123456789ABCDEF" res = "" while n > 0: res = digits[n % base] + res n //= base return res其他进制 --> 十进制使用Python内置的库进行转换：# 二进制 --> 十进制 num = '1001' print(int(num, 2)) # 四进制 --> 十进制 num = '123' print(int(num, 4)) # 六进制 --> 十进制 num = '12345' print(int(num, 6)) # 八进制 --> 十进制 num = '1234567' print(int(num, 8)) # 十六进制 --> 十进制 num = '12345678ABC' print(int(num, 16)) # 三十六进制 --> 十进制 num = '12345' print(int(num, 36))使用内置库，需要注意范围：2 ≤ num ≤ 36