我试图在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;
}
答案 0 :(得分:1)
你必须改变
for(y = 0; y < N; y++)
到
for(y = x + 1; y < N; y++)
因为,当您选择元素x
时,您必须在x
的剩余数组提前中搜索其副本,因此,y=x+1
为N
。如果您再次从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=0
到y=x+1
因为你使用0索引来比较相同的元素所以你将第二个元素的索引增加1。
它会起作用
答案 2 :(得分:0)
除了akaElement的答案,你还需要输出&#34; y&#34;作为索引而不计数因为你没有重置count变量,它会继续为所有外循环递增。
答案 3 :(得分:0)
在您的代码中,count
的使用不清楚,因为它不代表第一个重复发生的元素。相反,它代表了在第一场比赛之前执行的不等测试的总和。使用变量来标记第一个匹配将是一个标志,用于在没有菊花链break
,break
等的情况下停止迭代...它还简化了循环逻辑。 / 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