如何修改Python代码获取各位乘积等于给定值的n位及3位素数
实现乘积匹配n位数及3位素数筛选的代码修改方案
核心修改点
- 算术逻辑替换:将原有求和的减法迭代逻辑,替换为乘积匹配的除法迭代逻辑,每次递归前校验当前位数字能否整除剩余目标乘积,过滤无效递归路径,同时排除数字0(若目标乘积为0可单独适配)。
- 终止条件调整:原有递归终止判断为剩余求和值等于0,现在改为剩余目标乘积等于1,代表当前所有位数字相乘刚好等于初始给定的乘积目标。
- 新增素数校验逻辑:实现轻量素数判断函数,对筛选出的3位数做二次校验,过滤非素数结果。
- 语义优化:调整原有易混淆的
sum参数名为target_p,避免语义歧义。
修改后完整代码
# 素数校验函数,仅针对正整数 def is_prime(num): if num < 2: return False for i in range(2, int(num**0.5) + 1): if num % i == 0: return False return True def findNDigitNumsUtil(n, remaining_p, out, index, result): # 递归边界 if index > n: return # 已凑齐n位 if index == n: if remaining_p == 1: # 拼接数字 num_str = ''.join(out[:index]) result.append(num_str) return # 遍历当前位可选数字(排除0) for i in range(1, 10): if remaining_p % i != 0: # 不能整除的话后续乘积不可能匹配,直接跳过 continue out[index] = str(i) # 递归下一位,剩余乘积除以当前数字 findNDigitNumsUtil(n, remaining_p // i, out, index + 1, result) # 主函数:查询所有n位、各位乘积等于target_p的数字 def find_n_digit_nums_by_product(n, target_p, filter_prime=False): result = [] out = [''] * n # 首位不能为0,遍历1-9 for i in range(1, 10): if target_p % i != 0: continue out[0] = str(i) findNDigitNumsUtil(n, target_p // i, out, 1, result) # 需要筛选3位素数的场景 if filter_prime and n ==3: prime_result = [] for num_str in result: num = int(num_str) if is_prime(num): prime_result.append(num_str) return prime_result return result # 测试示例 if __name__ == "__main__": n = 3 target_p = 9 # 功能1:打印所有符合乘积条件的3位数 all_match = find_n_digit_nums_by_product(n, target_p) print("所有各位乘积等于9的3位数:", all_match) # 功能2:筛选符合条件的3位素数 prime_match = find_n_digit_nums_by_product(n, target_p, filter_prime=True) print("各位乘积等于9的3位素数:", prime_match)
运行结果
所有各位乘积等于9的3位数: ['119', '133', '191', '313', '331', '711', '911'] 各位乘积等于9的3位素数: ['191', '313', '331', '911']
和题目给出的示例完全匹配。
内容的提问来源于stack exchange,提问作者otoo
相关产品推荐
相关产品推荐

