我是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个整数,但我没有第一个线索,从哪里开始尝试索引它们。我也意识到有更先进的方法可以解决这个问题;但是,我正在尝试使用业余人员可以理解的基本概念来找到解决方案。
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
我知道找到重复的3种方法,2种已经回答,所以这里是第3种(简化) -
复杂度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
答案 2 :(得分:1)
这个有点痛苦,所以我在这里解释一下我做了一点:
首先,将标准的i / o库,#define数组大小包含在你想要的任何内容中,声明你的数组(我称之为我的:int entries [SIZE];)。
&#34之后的第一个for循环;输入10个数字&#34;是主要的一个,它允许你将10个数字推入数组。
以下if语句是应用于输入后输入的值的测试:
1)第一个if语句确保我们在适当的范围内输入值。
2)以下&#39;否则如果&#39;建议如果entries [i] = entries [0](意思是这是数组中的第一个对象),那么就不要做任何事情,因为没有什么可以比较它。
3)最后一个&#39;其他&#39;包含一个嵌套循环。外循环初始化为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]);
}
}
}
}
}
答案 3 :(得分: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");