2

我对C非常陌生,我希望得到一些指示。我试图输入一个数组的 7 个整数并搜索它们以查看是否有任何数字只出现一次。这是我到目前为止所拥有的:

#define size 7
int main(void)
{
int array[size], target, i, prev, count;
//Initialize the array
printf("Please enter %d integers", size);
scanf("%d", &target);
prev = array[0];
count = 1;

for(i = 0; i<size; i++)
{
scanf("%d", &array[i]);
...

我意识到这很糟糕,但 C 对我来说完全陌生。我想出了如何从用户那里输入这 7 个整数,但我没有第一个线索来说明从哪里开始尝试索引它们。我也意识到有更高级的方法可以解决这个问题。但是,我正在尝试使用业余爱好者可以理解的基本概念找到解决方案。

4

4 回答 4

3

搜索重复项的最简单方法(尽管不是最有效的方法)是对数组进行排序。您可以像这样使用内置qsort函数:

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

/* ... */

qsort (array, size, sizeof(int), compare);

int seen = 0;
for (int i = 1; i < size; ++i) {
  if (array[i] == array[i - 1]) {
    if (!seen) {
      printf("%d\n", array[i]);
      seen = 1;
    }
  } else {
    seen = 0;
  }
}
于 2012-09-14T06:07:16.397 回答
1

我知道 3 种查找重复项的方法,2 种已经回答,所以这里是第三种(简化)-

复杂度 O(N) 时间,O(M) 内存。

如果数字在某个范围内0 - M并且与元素的数量M相当,N则可以使用大小数组M+1来检查该数字之前是否出现过。

代码 -

int exists[M+1]; //set M to appropriate value
memset(exists, 0, sizeof(exists)); //set all 0 
for (i = 0; i < N; i++)
{
  if (exists[array[i]])
  {
    printf("Duplicate found\n");
    break; //or something else
  }
  exists[array[i]] = 1;
}

注意 - 不要忘记输入元素应该是正整数,不大于M

于 2012-09-14T06:37:42.027 回答
1

这一篇读起来有点头疼,所以我在这里稍微解释一下我做了什么:

首先,包含标准 i/o 库,#define array size to any you want,声明你的数组(我叫我的:int entries[SIZE];)。

“输入 10 个数字”之后的第一个 for 循环是主要循环,它允许您将 10 个数字推入数组。

以下 if 语句是应用于键入后输入的值的测试:

1) 第一个 if 语句确保我们输入正确范围内的值。

2) 下面的 'else if' 表明 if entries[i] = entries[0] (意思是如果这是数组中的第一个对象)我们什么也不做,因为没有什么可以比较的。

3) 最后一个“else”包含一个嵌套循环。外部循环初始化为 1,因此我们确保在内部循环中进行的比较中,我们始终将当前值与前一个值进行比较。

我希望这会有所帮助......干杯:)

*/

#include <stdio.h>

#define SIZE 10

//declarations
int entries[SIZE];

int main(void)
{
    printf("Enter 10 numbers:\n");

    for(int i = 0; i <= SIZE-1; i++)
    {
        printf("[%d]:\n", i);
        scanf("%d", &entries[i]);

        if(entries[i] < 10 || entries[i] > 100) {
            printf("Please enter valid number (between 10 and 100)\n");
            scanf("%d", &entries[i]);
        }
        else if(i == 0) {
            ;
        } else
        {
            for(int j = 1; j <= i; j++)
            {
                *//internal loop goes through all the previous entries (entries[i-1], entries[i-2], etc)*
                for(int k = 0; k < j; k++) {
                    if(entries[j] == entries[k])
                        printf("%d is a duplicate value\n", entries[i]);
                }
            }
        }
    }


}
于 2015-03-21T09:21:28.170 回答
0

这可以在 O(n^2) 算法中完成:

int yes = 1, i, j;
for (i = 0; i < n; ++i)
{
   for (j = i + 1; j < n; ++j) if (arr[i] == arr[j])
   {
       printf("Found a duplicate of %d\n", arr[i]);
       yes = 0;
       break;
   }
   if (!yes) break;
}
if (yes) printf("No duplicates");
于 2012-09-14T06:00:38.890 回答