《编程珠玑》上的一路题目,求问

《编程珠玑》上的一道题目,求问
就是第二章的第一个题目:
A:给定一个包含32位整数的顺序文件,它之多包含40亿个整数,并且没有排序。
请查找一个不在此文件中的32位整数。


1、如果内存足够,可以使用位图的方法,大约需要40亿/8字节的内存。这个方法没有疑问。

2、如果内存只有几百字节,但是有若干外部临时文件。此时如何解决?
那一节看完了,也没理解这个到底是怎么做的,求高手详细解释下。
还有,既然有若干外部存储,位图也可以从内存转移到外存吧,虽然这样可能要输入输出很多次。。。

------解决方案--------------------
仅供参考
//随机产生100000000个取值范围为[0~2的32次方减1]的数据,
//然后让用户输入一个数据,判断用户输入的数据是不是包含在前面随机产生的数据中。
//要求:当用户输入完成后,必须在1毫秒(千分之一秒)之内完成判断。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
long int i;
unsigned long ul;
unsigned long *d;
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    
------解决方案--------------------
(((unsigned long)rand()<<12)&0x00FFF000ul)
    
------解决方案--------------------
(((unsigned long)rand()    )&0x00000FFFul));
}
void main() {
    d=(unsigned long *)calloc(1<<(32-5),sizeof(unsigned long));
    if (NULL==d) {
        printf("Can not calloc(%d,%d)!\n",1<<(32-5),sizeof(unsigned long));
        return;
    }
    srand(time(NULL));
    for (i=0;i<100000000;i++) {
        while (1) {
            ul=ulrand();
            if (0==(d[ul>>5]&(1lu<<(ul%32)))) {
                d[ul>>5]
------解决方案--------------------
=1<<(ul%32);
                break;
            }
        }
        if (0==i%1000000) printf("%09d,%10lu\n",i,ul);
    }
    while (1) {
        printf("\nInput a number:");
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%lu",&ul)) break;
    }
    if (d[ul>>5]&(1<<(ul%32))) printf("Include.\n"    );
    else                       printf("Not include.\n");
    free(d);