数组中满足元素和等于积的数对计数及输入处理问题
问题解决方案
1. 效率优化:数学公式变形
先对等式 A[J] + A[I] = A[J] * A[I] 做代数变形:
移项得:
A[J]*A[I] - A[J] - A[I] = 0
两边加1配平:(A[J]-1)*(A[I]-1) = 1
整数范围内,两个数相乘等于1的情况只有两种:
- 两个因子都是1 → 对应
A[J]=2且A[I]=2 - 两个因子都是-1 → 对应
A[J]=0且A[I]=0
因此无需双重循环,只需统计数组中0的个数count0和2的个数count2,满足条件的数对数量直接通过组合数计算:count0*(count0-1)//2 + count2*(count2-1)//2
(注:此公式计算无序数对,与示例输出匹配;若需统计有序数对,可改为count0*count0 + count2*count2 - count0 - count2,即排除i=j的情况,允许i=j则直接用count0*count0 + count2*count2)
2. 输入读取限制
读取输入时,先获取N,再读取数组并截取前N个元素,确保只读取指定数量的元素:
n = int(input()) # 读取输入的数字列表,强制取前n个元素 arr = list(map(int, input().split()))[:n]
3. 语法错误修正
原代码中pairs+1是无效操作——它仅计算数值但未赋值回变量,正确写法是pairs += 1(等价于pairs = pairs + 1)。不过使用上述优化后的统计方法,无需循环计数,直接计算即可。
完整可运行代码
n = int(input()) arr = list(map(int, input().split()))[:n] count0 = 0 count2 = 0 for num in arr: if num == 0: count0 += 1 elif num == 2: count2 += 1 # 计算无序数对数量(匹配示例输出) result = count0 * (count0 - 1) // 2 + count2 * (count2 - 1) // 2 print(result)
测试示例输入:
3 2 4 2
输出:1,与示例一致。
内容的提问来源于stack exchange,提问作者Mosaab Barghouthy
相关产品推荐
相关产品推荐

