zoukankan      html  css  js  c++  java
  • 有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.   
  • 相关阅读:
    2016.8.16上午纪中初中部NOIP普及组比赛
    Laravel之Eloquent ORM
    Laravel基础
    sql
    PHP面向对象编程
    PHP判断远程文件是否存在
    专业术语之------耦合?依赖?耦合和依赖的关系?耦合就是依赖
    门禁系统socket通讯编程
    PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置
    PHP 真正多线程的使用
  • 原文地址:https://www.cnblogs.com/sxmcACM/p/2999866.html
Copyright © 2011-2022 走看看