c语言用哈希的方法在40、59、84、73、21、17、52、39、74、4、47、65、45、99、19 、97、64、67、85、22、23、83、98、69、88、3、42、60、1、94这三十个数中查找出三数之和等于100的三个数,并输出这三个数和输出其在原数组的索引下标。请给出详细注释
时间: 2023-07-03 10:28:25 浏览: 34
好的,下面是详细的代码实现和注释:
```c
#include <stdio.h>
#define MAX_SIZE 30 // 数组的最大长度
#define HASH_SIZE 101 // 哈希表的大小
int hash_table[HASH_SIZE]; // 哈希表
// 哈希函数,将数值映射到哈希表中的位置
int hash(int x)
{
return x % HASH_SIZE;
}
int main()
{
int nums[MAX_SIZE] = {40, 59, 84, 73, 21, 17, 52, 39, 74, 4, 47, 65, 45, 99, 19, 97, 64, 67, 85, 22, 23, 83, 98, 69, 88, 3, 42, 60, 1, 94};
int i, j, k;
// 初始化哈希表
for (i = 0; i < HASH_SIZE; i++) {
hash_table[i] = -1; // -1表示当前位置没有元素
}
// 遍历数组中的每个元素,将其插入到哈希表中
for (i = 0; i < MAX_SIZE; i++) {
int idx = hash(nums[i]); // 计算当前元素的哈希值
if (hash_table[idx] == -1) {
hash_table[idx] = nums[i]; // 如果当前位置没有元素,则直接存入
} else {
// 如果当前位置已经有元素了,就往后找空位置存储
while (hash_table[idx] != -1) {
idx = (idx + 1) % HASH_SIZE;
}
hash_table[idx] = nums[i];
}
}
// 遍历数组中的每个元素,查找是否存在能够与当前元素组成和为100的另外两个元素
for (i = 0; i < MAX_SIZE; i++) {
for (j = i + 1; j < MAX_SIZE; j++) {
int k_value = 100 - nums[i] - nums[j]; // 计算第三个元素的值
if (k_value < 0 || k_value >= 100) {
continue; // 如果第三个元素的值不在0~99的范围内,就跳过
}
int idx = hash(k_value); // 计算第三个元素的哈希值
if (hash_table[idx] == k_value) {
// 如果在哈希表中找到了第三个元素,就输出它们的值和索引下标
printf("找到一组解:(%d, %d, %d)\n", nums[i], nums[j], k_value);
printf("它们在原数组中的索引下标分别是:%d, %d, %d\n", i, j, idx);
}
}
}
return 0;
}
```
代码中,我们使用了一个长度为101的哈希表来存储能够组成100的数对(a,b),其中a的哈希值为i,b的值为100-a。具体来说,我们将每个数值通过哈希函数映射到哈希表中的位置,并将该位置存储为当前数值。如果该位置已经有元素了,就往后找空位置存储,直到找到一个空位置为止。
在查找三数之和等于100的三个数时,我们遍历数组中的每个元素,对于每个元素,再次遍历数组中剩余的元素,查找是否存在能够与当前元素组成和为100的另外两个元素。具体操作为:计算当前元素和剩余元素之和的哈希值,然后在哈希表中查找是否有对应的元素。如果找到了符合要求的三个元素,就输出它们的值以及它们在原数组中的索引下标。