有2.5亿个整数存放在一个文件中,(已知内存容量没有此文件大)如何判断出这个文件中有多少个不相同的数。

    1. #include<stdio.h>     
    2. #include<stdlib.h>     
    3. void record(int **p,unsigned int k)  //记录数据文件中读出的数……     
    4. {    
    5.     int i=k/32/5000;    //p[i]     
    6.     int j=(k-i*5000*32)/32;    //p[i][j]     
    7.     int m=k%32;    //p[i][j]的第m位     
    8.     int n=1;    //用1代表数k,0则表示文件数据中没有数k     
    9.     
    10.  n<<=m;    //确定位置,如12,第一个数p[0][0]的第12位为1,33则为第2个数p[0][1]的第33-32位为1,5001则p[1][0]的第1位为1     
    11.     *(*(p+i)+j)|=n;    
    12. }    
    13. void count_int(int *p,int *count)   //统计读出来的不同数的个数……     
    14. {    
    15.     register int i=0;    //寄存器应该会更快……     
    16.     register int j;    
    17.     register int k;    
    18.         
    19.     while(i<5000)    //遍历一指针数组中的5000个元素     
    20.     {    
    21.         j=0;    
    22.         k=1;    
    23.         while(j<32)    //遍历每个整型元素中的32位     
    24.         {    
    25.             if(k&*p)    //如果该位是1说明文件中有这个数,计数加1,0则无……     
    26.                 (*count)++;    
    27.             k<<=1;    //继续下一位     
    28.             j++;    
    29.         }    
    30.         p++;    //下一个元素……     
    31.         i++;    
    32.     }        
    33. }    
    34. void main()    
    35. {    
    36.    FILE *fp;    
    37.    register int i=0;    
    38.    unsigned int k=0;    //存放读出数据 ,读出的数可能是整型,要转换成无符号型……   
    39.    int count=0;    //记录不相同数的个数     
    40.    unsigned int num=4294967295;    //要统计整型数据全部范围所需要的位数……2^32位    
    41.    int memory_size=num/32;    //要分配的内存       
    42.    int *p[26844];    //26844=memory_size/5000+1     
    43.    char data_file[30];   //要打开的数据文件名     
    44.        
    45.    for(;i<memory_size/5000+1;i++)    
    46.        p[i]=calloc(5000,sizeof(int));    //分配堆内存,并初始化,不能一下分配太大的一块,不然会出错,所以我把它分成26844块,每块5000个整型元素     
    47.    printf("\n请输入存放数据的文件路径:");    
    48.    gets(data_file);    
    49.    if((fp=fopen(data_file,"rb"))==NULL)        //打开数据文件     
    50.    {    
    51.         printf("\n文件打开错误!");    
    52.         exit(0);    
    53.    }    
    54.    else    
    55.    {    
    56.         while(!feof(fp))    //如果未到文件尾则继续     
    57.         {                
    58.             fscanf(fp,"%d",&k);    //读出一个整型数据     
    59.             record(p,k);    //把内存p中第k位(bit位)变1     
    60.         }    
    61.    }    
    62.    for(i=0;i<26844;i++)   //遍历指针数组中的所有元素……     
    63.         count_int(p[i],&count);    
    64.    printf("\n共有 %d 个不相同的数!\n",count);    
    65. }    
    66.   
    67.   
原文地址:https://www.cnblogs.com/sxmcACM/p/2999866.html