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

问题描述:一个最多包括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;
}


你可能感兴趣的:(编程珠玑--第一章使用位图)