求数组中的不同元素个数

hpcph 2015-12-12 11:49:00


就是说 数组大小为5,里面有3个2,2个1,
不同元素的个数为2.
...全文
987 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-14
  • 打赏
  • 举报
回复
仅供参考:
//文件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;
}
醉花阴柳 2015-12-13
  • 打赏
  • 举报
回复
引用 9 楼 醉花阴柳的回复:
依题意可以声明int a[6],下标0-5就表示数字,数组元素初始化都为0(数组元素的值表示那个数字出现的次数),然后我假设数字是用户输入的(范围限定在5以内),用t来读取输入的数,读取一个后a[t]自增一。完了要输出时一个循环判断是否数组元素是否为0
原来是数组上限为5,我看成了数字大小上限5,如果数字有范围的话依然可以用这种简化的方法,否则就不行了,就稍微麻烦点
醉花阴柳 2015-12-13
  • 打赏
  • 举报
回复
依题意可以声明int a[6],下标0-5就表示数字,数组元素初始化都为0(数组元素的值表示那个数字出现的次数),然后我假设数字是用户输入的(范围限定在5以内),用t来读取输入的数,读取一个后a[t]自增一。完了要输出时一个循环判断是否数组元素是否为0
lm_whales 2015-12-12
  • 打赏
  • 举报
回复
扫描每个元素知道不等, 计数加一 如果没结束,开启下一趟扫描
LightYXXX 2015-12-12
  • 打赏
  • 举报
回复
先用for循环 然后下面用if来判断 如果跟每一个不同 break 输出
醉花阴柳 2015-12-12
  • 打赏
  • 举报
回复
就楼主的问题用简化的桶排序就可以
paschen 2015-12-12
  • 打赏
  • 举报
回复
如果数据量大了可以排序了找,这样效率高
hpcph 2015-12-12
  • 打赏
  • 举报
回复
#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; }
lm_whales 2015-12-12
  • 打赏
  • 举报
回复
噢 排序是要的 或者采用计数的方式
logiciel 2015-12-12
  • 打赏
  • 举报
回复
#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;
}
hpcph 2015-12-12
  • 打赏
  • 举报
回复
简化的桶排序,不太了解..具体是怎样的 我写的: 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);

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧