部份内容参考于:
https://blog.csdn.net/gamesofsailing/article/details/18001703

一定要好好读题,我第一次理解这个题其实理解错了,我以为是求不同号码的每个的个数,后来读了好多遍题,对不起,我的问题,bitmap只能确定这个号码是不是在,是那么对应的bit位为1,不是为0,我们统计所有bit位的1的个数就是不同号码的个数。

每个号码8位,最多就有99999999个号码,需要99999999个bit位来表示这些号码,大约是125000000个字节,想要int类型的数组存,大约3*1021*1024个int区域。

ps:这里有一个问题,可能无关紧要但是这个坑我找了两天,我们在栈区声明这么大的int类型的数组,但是因为Linux默认给一个进程分配的栈空间大小为8M。我们申请数组的大小已经超过了8M,我真的恨,我太菜了,给忘了,就一直报段错误。我以为是指针什么的,唉,大家引以为戒!然后可以临时修改一下栈大小。


首先判断这个号码在数组的哪个位置,比如说号码为63那么它应该在第二个比特数组里,怎么得出来的,63/32,在第二个比特数组的哪一位呢?63%32,在第二个比特数组的第31位,将这个比特数组的第31位置成1,然后统计所有比特位为1的个数,就能得出一共有多少个电话号码。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define BIT_SIZE          3 * 1024 *1024
#define PHONE_SIZE        99999999void set_bits(int num, int *bits);
int count_phone(int *bit);void set_bits(int num, int *bits)
{int pos, mod;int mark;pos = num / 32;  mod = num % 32;mark = 1 << mod;bits[pos] |= mark;
}int count_phone(int *bits)
{int i;int count = 0;for(i = 0;i < BIT_SIZE;i++){while(bits[i] > 0){if(bits[i] & 1)count++;bits[i] = bits[i] >> 1;}}return count;
}
int main(int argc, char *argv[])
{FILE *fp;int bits[BIT_SIZE];memset(bits,0,sizeof(bits));char line[1024];if (argc != 2)  return -1;fp = fopen(argv[1], "r");while (fgets(line, sizeof(line), fp)) {int num;num = atoi(line);set_bits( num, bits);}fclose(fp);printf("phone number count %d\n", count_phone(bits));return 0;
}


已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数,bitmap实现代码。相关推荐

  1. 威纶通触摸屏分期付款锁机(带PC程序) 文件内包含 威纶通触摸屏源程序例子(含宏程序) 总共两个页面可以快速移植到自己的程序上

    威纶通触摸屏分期付款锁机(带PC程序) 文件内包含 威纶通触摸屏源程序例子(含宏程序) 总共两个页面可以快速移植到自己的程序上. 带PC端程序自动计算设定时间密码. 宏程序带详细注释,适合学习 可以动 ...

  2. 参数检验——当总体分布已知(如总体为正态分布),根据样本数据对总体分布的统计参数进行推断 非参数检验——利用样本数据对总体分布形态等进行推断的方法。...

    参数检验(parameter test)全称参数假设检验,是指对参数平均值.方差进行的统计检验.参数检验是推断统计的重要组成部分.当总体分布已知(如总体为正态分布),根据样本数据对总体分布的统计参数进 ...

  3. 【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。

    2016年小米校招笔试第三题(西安站) 3 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共 ...

  4. 请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码

    请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码 出现这个问题按照提示上的来看应该是手机号码输入的不对 但是输入的手机号码的确是11位 这个手机号是开发者账号绑定的手机号 也就 ...

  5. 苹果开发者账号renew时出现“请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码”

    苹果开发者账号到期,renew时在提交订单时在手机号一栏中出现以下报错: 请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码 因为解决问题后才想起要写个博客告诉遇到这个问题的小伙 ...

  6. 已知.bit文件和.ltx文件用Vivado 的 ILA debug调试步骤

    这个想要成功之前是需要搭建好硬件平台的,比如我自己的板子是自己开发的,就和官方的Xilinx的开发板等有所区别,jtag线要插好一一对应上.开始的时候我就是没有对应好管脚,只是电源vcc插对了,也看不 ...

  7. 根据已知txt文件,将文件夹中的文件进行分类

    shutil模块的使用 try...finally...的使用 import shutil import os path = r"./val_npz" os.makedirs(pa ...

  8. 绘制三维多面体 Matlab,已知一些随机的三维坐标点,怎么用matlab把这些点绘制成多面体,急求程序代码啊...

    匿名用户 1级 2013-04-26 回答 例如: A=[1.486,3.059,0.1;2.121,4.041,0.1;2.570,3.959,0.1;3.439,4.396,0.1;4.505,3 ...

  9. 已知a和b的最大公因数和最小公倍数求这两个数字

    描述 GCD(the Greatest Common Divisor):最大公因数. LCM(the Least Common Multiple):最小公倍数. 请问是否存在两数 c 和 d 满足 G ...

最新文章

  1. SAP MM MB1C + 523 移动类型的使用
  2. 修改.fig文件中图的x轴或y轴的标题及数据图
  3. 基本概念—机器学习ML与深度学习DL
  4. 子商城管理之签到活动
  5. RTX5 | 线程标志组01 - 线程同步
  6. Springboot 中的header, cookie, session
  7. axios_的请求响应结果的结构---axios工作笔记006
  8. CentOS - thin web server for Ruby(centos下安装thin,运行rails)
  9. s:radio 赋值取值和添加事件
  10. windows 下搭建 git 服务器 gogs
  11. CSS-fishc学习笔记
  12. Android USB打印机
  13. 域名 与 ip 地址
  14. Springboot JPA注解@Enumerated
  15. 产品经理的23个OKR案例(下)
  16. 1+1备份和1:1冗余备份区别
  17. 常用文件密码破解工具
  18. python设置散点图点的大小_python_matplotlib分别使用plot()和scatter()画散点图,以及如何改变点的大小...
  19. 左联接、右联接、内联接、自然联接
  20. 二进制bit0是什么意思_阜平吧在讨论5G的问题,感觉挺有意思,科普下……

热门文章

  1. Python ·保险理赔分析:数据分析
  2. python 股票图形识别_用Python可视化股票指标
  3. python循环练习
  4. HP笔记本BIOS硬盘SATA模式修改详细教程!
  5. 给 Dreamweaver CS4安装插件 jQuery_API.mxp
  6. 电源电路设计:详解线性电源和开关电源
  7. Mathtype在word中编辑公式,序号右对齐且自动排序,域代码去除
  8. 说好不哭,但是再次听到你的新歌还是没忍住
  9. 狂神css视频笔记16课
  10. Android文件夹占用空间分析,安卓手机储存空间变小了?删掉这6个文件夹,瞬间腾出20G!...