C语言编程,设计函数计算一个整形数组中有几个不同元素(简洁)

举个例子,例如有一个数组a[20]={1,2,3,4,5,1,2,3,5,6,1,2,3,4,2,3,4,6,1,2},编程实现得出有6个不同的元素。
详细代码,谢谢。

DEV-CPP 5.4 纯C语言环境,通过编译和测试

#include<stdio.h>
int fun(int a[],const int n){
int i,j,k,t=n;
for(i=0;i<n;i++){
for(k=0;k<i;k++) if(a[k]==a[i]) goto sss;
for(j=0;j<n;j++){
if(j==i) continue;
if(a[i]==a[j]){
t--;
}
}
sss:;
}
return t;
}
int main(){
int n,a[128],i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
printf("%d",fun(a,n));
return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-12-17
开个布尔数组初值为FALSE,枚举一遍遇到新的之后把布尔数组的值改为TRUE,元素数+1
或者直接开一个STL的map把数据一个个插入之后输出map内元素个数追答

要函数的话,形参就传递数组指针吧

追问

可以给详细代码么?不懂,我刚学C

追答

c++可以吗

追问

可以,最好是C

追答

应该是最简单的写法了,输入n,再输入n个元素,用STL自带的排序和去重函数返回元素个数

追问

说好的详细代码呢?就是像这样的呀
#include
main()
{
int a,b;
int k,c;
while(scanf("%d%d",&a,&b)!=EOF)
{
if (a==0&&b==0)
{
printf("1 ");
continue;
}

追答

#include
using namespace std;
int a[20010];
bool p[20010];
void sc(int n)
{
int tot=0;
for(int i=1;i<=n;++i)
if(!p[a[i]])
tot+=p[a[i]]=1;
printf("%d",tot);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
sc(n);
return 0;
}
这个好理解一点

那一条前面不是代码吗……

我只是发了代码之后解释了一下那个的思路……

第2个回答  2016-12-17
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int fun(int a[], int n) {
int i,j;
int count = 0;

char *c = (char*)malloc(n*sizeof(char)); // 标记数组元素是否因为重复,而被删除
memset(c,0,n*sizeof(char)); // 所有标志位,清零

for(i=0; i<n-1; i++){
if(c[i]) continue;
count++;

for(j=i+1; j<n; j++) {
if(c[j]) continue;
if(a[i]==a[j]) c[j]=1; //如果有重复的元素,标记为删除
}
}

//打印不同的元素
printf("去掉重复数据之后是:\n");
for(i=0; i<n-1; i++){
if(!c[i]) printf("%d ", a[i]);
}
printf("\n");

return count;
}

int main(void){
int i;
int a[20]={1,2,3,4,5,1,2,3,5,6,1,2,3,4,2,3,4,6,1,2};
int count;

printf("数组原始数据是:\n");
for(i=0; i<20; i++) {
printf("%d ", a[i]);
}
printf("\n");

count= fun(a,20);

printf("\n不重复的元素个数是: %d\n", count);

getchar();
}
相似回答