数字拆分算法求助:寻找左右乘积相等的最小拆分点
解决方案
算法逻辑
要找到最小的拆分点,核心是从左到右遍历所有可能的拆分位置,逐个验证左右两侧数字的乘积是否相等,第一个满足条件的位置就是最小拆分点:
- 先判断数字长度是否小于2,若是直接返回-1(无法拆分)。
- 遍历拆分点
k,范围是1到len(res)-1(k表示左侧包含前k个数字,右侧包含剩余数字)。 - 对每个
k,分别计算左侧和右侧数字的乘积。 - 若左右乘积相等,立即返回当前
k(从左到右遍历,第一个符合条件的就是最小拆分点)。 - 遍历完所有拆分点都未找到符合条件的,返回-1。
完整代码实现
a = int(input("enter a number=")) res = [int(x) for x in str(a)] n = len(res) # 数字长度不足2,无法拆分 if n < 2: print(-1) else: found = False # 从最小的拆分点开始遍历 for k in range(1, n): # 计算左侧乘积 left_product = 1 for num in res[:k]: left_product *= num # 计算右侧乘积 right_product = 1 for num in res[k:]: right_product *= num # 验证乘积是否相等 if left_product == right_product: print(k) found = True break # 未找到有效拆分点 if not found: print(-1)
代码优化(可选)
上面的代码直观但存在重复遍历,可通过总乘积优化计算效率(需处理总乘积为0的特殊情况):
a = int(input("enter a number=")) res = [int(x) for x in str(a)] n = len(res) if n < 2: print(-1) else: # 计算总乘积,同时标记是否包含0 total_product = 1 has_zero = False for num in res: if num == 0: has_zero = True total_product *= num left_product = 1 found = False for k in range(1, n): left_product *= res[k-1] # 总乘积为0时,需左右都包含0才满足条件 if total_product == 0: right_has_zero = any(num == 0 for num in res[k:]) if left_product == 0 and right_has_zero: print(k) found = True break # 总乘积非0时,右侧乘积=总乘积/左侧乘积 else: right_product = total_product // left_product if left_product == right_product: print(k) found = True break if not found: print(-1)
测试示例
- 输入
142811:遍历到k=3时,左侧乘积1*4*2=8,右侧乘积8*1*1=8,返回3。 - 输入
301501:遍历到k=2时,左侧乘积3*0=0,右侧乘积1*5*0*1=0,返回2。
内容的提问来源于stack exchange,提问作者helping hand
相关产品推荐
相关产品推荐

