考虑一组n个不同的正整数a1,a2,...,an,它们的值在1到1000000之间。给定一个整数x。写一个程序sumx计算这样的数对个数(ai,aj),1<=i<j<=n并且ai+aj=x。c++
时间: 2024-10-14 18:05:29 浏览: 60
这是一个经典的哈希表(Hash Table)或前缀和(Prefix Sum)问题,可以使用C++解决。首先,我们可以遍历数组`a`,对于每个元素`ai`,我们可以在一个哈希表或映射`count`中记录从1到当前`ai`的所有和出现的次数。接着,为了找到满足`ai + aj = x`的数对,我们需要查找`x - ai`在`count`中的值。如果存在,则有`count[x - ai]`对符合条件。
以下是简单的C++代码实现:
```cpp
#include <iostream>
#include <unordered_map>
int sumX(std::vector<int>& a, int x) {
std::unordered_map<int, int> count(1, 0); // 初始化计数器为0,键从1开始
for (int i = 0; i < a.size(); ++i) {
// 更新频率:count[a[i]]++
count[a[i]]++;
// 遍历前缀和,寻找目标和
if (count.find(x - a[i]) != count.end()) {
return count[x - a[i]]; // 返回满足条件的数对数量
}
}
return 0;
}
int main() {
std::vector<int> a = {2, 7, 11, 15}; // 例子输入
int x = 9; // 示例目标和
int result = sumX(a, x);
std::cout << "Number of pairs with sum " << x << ": " << result << std::endl;
return 0;
}
```
阅读全文