user-0 提问: 求数组中的不同元素个数

回复:
user: user-1
content: 仅供参考：//文件1中的内容排序并去重,结果保存到文件2中 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; int c,n,hh,i,L; FILE *f; char ln[MAXCHARS]; int ignore_case=0; int icompare(const void *arg1,const void *arg2) {    return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) {    return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) {     if (argc<3) {         printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");         printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);         return 1;     }     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not find file %s!\n",argv[1]);         return 1;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(f);         printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 2;     }     n=0;     hh=0;     i=0;     while (1) {         if (NULL==fgets(ln,MAXCHARS,f)) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);             while (1) {                 c=fgetc(f);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             strcpy(buf+i,ln);i+=MAXCHARS;             n++;             if (n>=MAXLINES) {                 MAXLINES2=MAXLINES*2;                 if (MAXLINES2==1280000) MAXLINES2=2500000;                 buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);                 if (NULL==buf2) {                     printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     printf("WARNING: Lines >%d ignored.\n",MAXLINES);                     break;//                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(f);     if (n>1) {         if (ignore_case) qsort(buf,n,MAXCHARS,icompare);         else qsort(buf,n,MAXCHARS,compare);     }     f=fopen(argv[2],"w");     if (NULL==f) {         free(buf);         printf("Can not create file %s!\n",argv[2]);         return 2;     }     fprintf(f,"%s\n",buf);     if (n>1) {         if (ignore_case) {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if (stricmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         } else {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         }     }     fclose(f);     free(buf);     return 0; }

user: user-2
content: 引用 9 楼 醉花阴柳的回复:依题意可以声明int a[6]，下标0-5就表示数字，数组元素初始化都为0(数组元素的值表示那个数字出现的次数)，然后我假设数字是用户输入的(范围限定在5以内)，用t来读取输入的数，读取一个后a[t]自增一。完了要输出时一个循环判断是否数组元素是否为0 原来是数组上限为5，我看成了数字大小上限5，如果数字有范围的话依然可以用这种简化的方法，否则就不行了，就稍微麻烦点

user: user-2
content: 依题意可以声明int a[6]，下标0-5就表示数字，数组元素初始化都为0(数组元素的值表示那个数字出现的次数)，然后我假设数字是用户输入的(范围限定在5以内)，用t来读取输入的数，读取一个后a[t]自增一。完了要输出时一个循环判断是否数组元素是否为0

user: user-3
content: 扫描每个元素知道不等， 计数加一 如果没结束，开启下一趟扫描

user: user-4
content: 先用for循环  然后下面用if来判断  如果跟每一个不同 break   输出

user: user-2
content: 就楼主的问题用简化的桶排序就可以

user: user-5
content: 如果数据量大了可以排序了找，这样效率高

user: user-0
content: #include <stdio.h>   int main() {   int a[] = {1,4,5,26,5,2,3,1,5,4,8,5};   int count = sizeof(a) / sizeof(a[0]);   int n = 0;   for (int i = 0; i < count ; i++) {     for (int j = i + 1 ; j < count ; j++) {       if ( a[i] == a[j]) { //改 if ( p[i] == p[j]) {         n++;         break;//加       }     }     //移 printf("%d", count - n);               //应该移动吧,移了n不就重复减多了嘛   }   printf("%d\n", count - n);   return 0; }

user: user-3
content: 噢 排序是要的 或者采用计数的方式

user: user-6
content: #include <stdio.h>  int main() {   int a[] = {1,4,5,26,5,2,3,1,5,4,8,5};   int count = sizeof(a) / sizeof(a[0]);   int n = 0;   for (int i = 0; i < count ; i++) {     for (int j = i + 1 ; j < count ; j++) {       if ( a[i] == a[j]) { //改 if ( p[i] == p[j]) {         n++;         break;//加       }     }     //移 printf("%d", count - n);   }   printf("%d\n", count - n);   return 0; }

user: user-0
content: 简化的桶排序,不太了解..具体是怎样的 我写的: int a[] = {1,4,5,26,5,2,3,1,5,4,8,5};   int count = sizeof(a) / sizeof(a[0]);     int n = 0;     for (int i = 0; i < count ; i++) {         for (int j = i + 1 ; j < count ; j++) {             if ( p[i] == p[j]) {                 n ++;             }         }     printf("%d", count - n);