我正在尝试用C中的向量(数组)实现以下问题的解决方案。 我想输入一个数字和它发生的次数。
这是一个例子:
Imput n: 5
Imput num 1: 8
Imput num 2: 9
Imput num 3: 8
Imput num 4: 5
Imput num 5: 5
该程序现在将显示:
Number 8: 2 occurences
Number 9: 1 occurences
Number 5: 2 occurences
但我的节目:
Number 8: 2 occurences
Number 9: 1 occurences
Number 8: 2 occurences
Number 5: 2 occurences
Number 5: 2 occurences
我该怎么办? TY
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
int main ()
{
int vett1[SIZE], vett2[SIZE];
int n, i, j;
int flag;
printf ("Imput n: ");
scanf ("%d", &n);
for (i=0; i<n; i++)
{
printf ("Imput %d di %d: ", i+1, n);
scanf ("%d", &vett1[i]);
}
printf ("\n\nYour vector: : ");
for (i=0; i<n; i++)
{
printf ("%d ", vett1[i]);
}
for (i=0; i<n; i++)
{
flag=0;
for (j=0; j<n; j++)
{
if (vett1[j] == vett1[i])
{
flag++;
}
}
vett2[i] = flag;
}
printf ("\n\n");
for (i=0; i<n; i++)
{
printf ("Number %d: %d occurencese\n", vett1[i], vett2[i]);
}
return 0;
}
答案 0 :(得分:2)
您需要一种方法来跟踪(1)数字,以及(2)出现次数。想象一下:如果你是手工制作,用铅笔和纸,而不是用电脑,你会怎么做?
你可能需要一张纸上面有一张小桌子,左栏中有数字,右栏中有出现的数字。然后,您将查看数字(在您的情况下为8,9,8,5,5),对于每个数字,您将检查它是否在您的表中。如果它已在表中,则将计数递增1。如果不在表格中,请将其放在新行上,计数为1。
现在你需要做的就是将这个表实现为不是纸上的表,而是实现某种数据结构。
答案 1 :(得分:0)
你的上一段代码写道:
for (i=0; i<n; i++)
{
printf ("Number %d: %d occurencese\n", vett1[i], vett2[i]);
}
你在每个输入数字上打印n次以显示相应的出现次数,所以我认为你只需要更改打印输出功能即可。
答案 2 :(得分:0)
您希望仅查看每个号码一次。有几种方法可以实现这一目标:
每当您检查一个数字时,首先要查看它是否是数组中第一次出现这个数字。如果没有,请忽略它。非常低效,因为在查看第n个元素时,您需要返回并检查它之前的所有元素。
与上述类似,但将第一次出现验证与计数结合起来。您有两个嵌套循环,i
和j
。如果j
循环看到vett1[j] == vett1[i]
j<i
,则表示这不是此数字的第一次出现。忽略它。这与您当前的解决方案一样高效。
排序 - 使用qsort
对数组进行排序。然后再过一次。现在每个数字的出现都是一个接一个,所以你只需要一次传递数就可以很容易地计算它们。这是最有效的方式,但有点复杂。
答案 3 :(得分:0)
您的代码是正确的,您只需要修改上一次打印循环,只需检查那里的条件,如果该元素与之前类似,则再次跳过打印。
for(i=0;i<n;i++)
{
if(vett1[i+1] == vett1[i])
continue;
else
printf("Number %d %d occurence",vett1[i],vett2[i]);
}