如何在随机生成的整数数组中输出第一个重复数的索引(C)

时间:2015-02-02 06:02:42

标签: c

我试图在C中编写一个程序,它将在0-99之间生成50个随机整数,然后打印出或抛出第一个重复数出现的索引处的变量。我认为使用数组将是最好的方法。我似乎成功地生成了一个随机数组(为此目的足够随机)整数并将它们抛入一个数组。

但是,在比较数组的每个元素时,我的for循环遇到了问题。看起来我最终将索引1与索引1进行比较并获得匹配 这是我目前的代码供参考。任何帮助/建议都会非常感激 - 我是一个编程新手:)

#include <stdio.h>
#include <stdlib.h>

int main()
{
//define the test pool(N - people in the birthday problem)
//and possible unique attributes(M - birthdays in the birthday problem)
int N = 50;
int M = 100;
int i;
int x;
int y;
int arr[N];
int count = 1;

//use for loop to populate an array of length N with numbers ranging
//from 0 to 99
for(i = 0; i < N; i++)
        {
                arr[i] = rand() % (M-1);
                printf("%d\n", arr[i]);
        }

//just formatting the output a little
printf("\n\n\n");


//iterate through the array at each position, comparing it to all other
//positions in the array.  if array[x] does not equal array[y] increment
//the counter.  if it does match, print the counter to the screen.
for(x = 0; x < N; x++)
        {
                for(y = 0; y < N; y++)
                        {
                                if(arr[x] != arr[y])
                                        {
                                                count++;
                                        }
                                else
                                        {
                                                printf("the first repeat is  at:  ");
                                                printf("%d\n", count);
                                                break;
                                        }
                                break;
                        }
                break;
        }

return 0;

}

5 个答案:

答案 0 :(得分:1)

你必须改变

 for(y = 0; y < N; y++)

 for(y = x + 1; y < N; y++)

因为,当您选择元素x时,您必须在x的剩余数组提前中搜索其副本,因此,y=x+1N。如果您再次从y=0开始搜索重复内容,则最终会在x或之前找到x个重复内容。

更好的方法:

在您的实现中,您必须运行两个循环来检查重复。更快的方法是记录counter数组中出现的每个数字的计数,并仅运行单个循环,检查是否counter[ arr[i] ] > 1,这意味着元素arr[i]已重复至少一次。

代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
//define the test pool(N - people in the birthday problem)
//and possible unique attributes(M - birthdays in the birthday problem)
        int N = 50;
        int M = 100;
        int i;
        int x;
        int y;
        int arr[N];
        //Counter[M] will store the number of occurences
        //of M in the program;
        int counter[M];
        int count = 1;

        for(int i = 0;i < 100; ++i)
        {
                counter[i] = 0;
        }
//use for loop to populate an array of length N with numbers ranging
//from 0 to 99
        for(i = 0; i < N; i++)
        {
                arr[i] = rand() % (M-1);
                printf("%d\n", arr[i]);
                counter[arr[i]]++; 
                //^^^^^^^^^^^^^^^ Incrementing the count array
                //of the particular element arr[i].
        }

//just formatting the output a little
        printf("\n\n\n");


//iterate through the array at each position, comparing it to all other
//positions in the array.  if array[x] does not equal array[y] increment
//the counter.  if it does match, print the counter to the screen.
        for(x = 0; x < N; x++)
        {
                if (counter[arr[x]] > 1)
                {
                        printf("the first repeat is  at:  ");
                        if (youWantTheIndex)
                        {
                            printf("%d\n", x); //This prints the index
                        }
                        else if (youWantTheElement)
                        {
                        printf("%d\n", arr[x]); //This prints the element.
                        }
                        break;
                }
        }
return 0;

}

答案 1 :(得分:0)

第二次循环更改y=0y=x+1

因为你使用0索引来比较相同的元素所以你将第二个元素的索引增加1。

它会起作用

答案 2 :(得分:0)

除了akaElement的答案,你还需要输出&#34; y&#34;作为索引而不计数因为你没有重置count变量,它会继续为所有外循环递增。

答案 3 :(得分:0)

在您的代码中,count的使用不清楚,因为它不代表第一个重复发生的元素。相反,它代表了在第一场比赛之前执行的不等测试的总和。使用变量来标记第一个匹配将是一个标志,用于在没有菊花链breakbreak等的情况下停止迭代...它还简化了循环逻辑。 / p>

    int count = 0;
    ...
    for (x = 0; x < N && count == 0; x++) {
        for (y = x+1; y < N; y++) {
            if (arr[x] == arr[y]) {
                count++;
                printf (" the first repeat is at:  %d & %d  (%d)\n\n", x, y, arr[x]);
                break;
            }
        }
    }

在这里,您会将count更多地视为found,而不是实际的索引计数。如图所示格式化,您将收到第一个重复的索引信息以及重复值:

 the first repeat is at:  1 & 39  (43)

答案 4 :(得分:0)

您可以尝试这种方法来解决您的问题。 在这里,我举了一个例子,其中数组是5个元素,但你可以用你已经拥有的随机填充数组来改变它。

 int main() {
        int N = 5;
        int arr[5] = {1,2,3,1,2};
        for(int i = 0; i < N-1; i++) {
            for(int j = i+1; j < N; j++) {
                if(arr[j] == arr[i]) {
                    printf("first repeat of arr[%d]=%d is at index %d\n", i,arr[i],j);
                    break;//return to the outter loop
                }
            }
        }
        return 0;
    }

注意:内部循环从outter循环指向的下一个索引开始,因此您不会将相同的数字与自身进行比较。 另外,请注意,外部循环以N-2结束,相当于i<N-1 那是因为你不想从非法单元格中读取,因为内部循环从i+1

开始