#include<stdio.h> #include<stdlib.h> /* 在一个论坛,发现有三个发帖很多的Id ,他们发帖的总数都超过了总数的1/4 ,编程快速的找到这三个id 算法: 每次删除是个不同的Id ,那么最后剩下的 三个Id 就是所求的id */ void findThreeK(int* p,int length) { int candidate[3],nTimes[3]={0,0,0},i; for(i=0;i<length; i++) { if(p[i]==candidate[0]) { nTimes[0]++; } else if(p[i]==candidate[1]) { nTimes[1]++; } else if(p[i]==candidate[2]) { nTimes[2]++; } else if(nTimes[0]==0) { candidate[0]=p[i]; nTimes[0] = 1; } else if(nTimes[1]==0) { candidate[1]=p[i]; nTimes[1] = 1; } else if(nTimes[2]==0) { candidate[2] = p[i]; nTimes[2] = 1; } else { nTimes[0]--; nTimes[1]--; nTimes[2]--; } } for(int i = 0 ; i < 3;i++) printf("%d " ,candidate[i]); } int main() { FILE *fread = fopen("Id.txt","r"); if(fread==NULL) { printf("can't open the file!\n"); exit(0); } int current = 0; // 动态初始化数组 p ,如果不初始化会出现错误 int *p = (int*)malloc(sizeof(int)*10); // id数组的长度 int length = 0 ; // 将 数据读入内存,存入数组P while(fscanf(fread,"%d",¤t)!=EOF) { if(length%10==0) p = (int*)realloc(p , sizeof(int)*(length+10)); p[length] = current; length++; } findThreeK(p,length); /* for(int i = 0 ;i < length ;i++) printf("%d ",p[i]); */ system("pause"); return 0; }