您的位置:首页 > 编程语言

编程珠玑--第一章使用位图

2012-07-25 22:33 239 查看
问题描述:一个最多包括n个正整数的文件,每个数都小于n,其中n=10000000.如果在输入文件中有任何整数重复出现的话就是致命错误。要求按升序输出这些数。
由于我们只能操纵字节,但是我们可以使用字节来操纵字节中的位,我们使用int(4个字节),如果我们想要将第k位置为1的话,我们只需要这样操作:
a[k/32]|pow(2,31-k%32),当我们要判断某位是不是1的时候,使用相似的方法:a[k/32]&pow(2,31-k%32)
#include<iostream>
#include<cmath>
using namespace std;

int a[312500];
int main(){
	memset(a,0,sizeof(a));
	//读文件
	int readin;
	while(cin>>readin)
		a[readin/32]=a[readin/32]|(int)pow(2.0,31-readin%32);

	//判断
	for(int i=0;i<10000000;i++)
		if((a[i/32]&(int)pow(2.0,31-i%32))!=0)
			cout<<i<<endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: