已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
2014-01-08 15:26
316 查看
已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
#include <stdio.h>
#include <string.h>
#define BIT_SIZE 3 * 1024 *1024
#define PHONE_SIZE 99999999
void 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) {
bits[i] &= bits[i] - 1;
count++;
}
}
return count;
}
int main(int argc, char *argv[])
{
FILE *fp;
int bits[BIT_SIZE];
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位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
#include <stdio.h>
#include <string.h>
#define BIT_SIZE 3 * 1024 *1024
#define PHONE_SIZE 99999999
void 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) {
bits[i] &= bits[i] - 1;
count++;
}
}
return count;
}
int main(int argc, char *argv[])
{
FILE *fp;
int bits[BIT_SIZE];
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;
}
相关文章推荐
- bit-map程序(解决已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数)
- 从文件读取包含数字和字母字符串,统计每个字符出现的次数,将次数输出到另外一个文件
- 编写一个程序,统计给定文件中包含的每个单词出现的频率,并按单词表的顺序显示统计结果
- 小明买了一些彩色的气球用绳子串在一条线上,想要装饰房间,每个气球都染上了一种颜色,每个气球的形状都是各不相同的。我们用1到9一共9个数字表示不同的颜色,如12345则表示一串5个颜色各不相同的气球串。但小明希望得到不出现重复颜色的气球串,那么现在小明需要将这个气球串剪成多个较短的气球串,小明一共有多少种剪法?如原气球串12345的一种是剪法是剪成12和345两个气球串。
- 【代码】统计文件中,不同字符出现的次数(可排序,没有处理英文单词、数字和大小写)
- java读取txt文件,并统计每行中每个字母出现的次数,并将产生的数字保存到一个新的txt文件中(有加分)
- C++统计一个文件中每个数字字符(0~9)出现的次数
- 第13周-项目1-小玩文件-用键盘输入文件名,统计输出文件中每个字母、数字字符出现的次数
- 解析文件。文件内容可能包含英文字母、数字、汉字等,统计文件中各个数字和英文字母各自的数量,区分大小写
- Java上机实现统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数?
- Java上机实现统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数?
- mysql 统计包含数字和分隔符的字符串,数字有几个
- 【代码】【有统计错误,待修改】统计文件中,不同字符出现的次数(未排序)
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 常用的js验证代码_数字|电话号码|传真|邮箱|手机号码|邮编
- 头文件包含顺序不同导致成员函数指针定义产生异常
- codeforces 55D 求数字能被自己每个数位上的数整数的统计
- 包含别人的dll,然后我们用类库再次封装成dll的时候的注意事项;源文件与模块生成时的文件不同;创建调试信息文件 ··PDB时发生意外的错误,进程无法访问文件,因为另一个程序正在使用此文件
- 分割字符串(有一个字符串,其中包含中文字符、英文字符和数字字符, * 请统计和打印出各个字符的个数)
- 正则表达式验证代码(字母、数字、Email、网址、电话号码、汉字、身份证号码) (转载)