Chinaunix首页 | 论坛 | 博客
  • 博客访问: 471747
  • 博文数量: 134
  • 博客积分: 3056
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 15:53
文章分类
文章存档

2013年(1)

2010年(133)

我的朋友

分类: C/C++

2010-11-08 17:45:37

问题来源
《编程珠玑II》第一章的内容

精确的问题陈述如下

输入:

所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,这里的n10^7。如果输入时某一个整数出现了两次,就会产生一个致命的错误。这些整数与其他任何数据都不关联。

输出:

以增序形式输出经过排序的整数列表。(这里应该补充一下是文件形式吗?)

约束:

至多(大概)只有1MB的可用主存,但是可用磁盘空间非常充足。运行时间至多只允许几分钟,最适宜的时间大概为10秒钟。

实现思路

#include <stdio.h>
#include <stdlib.h>

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1f
#define N 10000000
int a[1+N/BITSPERWORD];

void set(int i)
{
    a[i >> SHIFT] |= (1 << (i & MASK));
}
void clr(int i)
{
    a[i >> SHIFT] &= ~(1 << (i & MASK));
}
int test(int i)
{
    return a[i >> SHIFT] & (1 << (i & MASK));
}

int main()
{
    set(5000);
    if(test(5000)) {
        printf("5000\n");
    }else{
        printf("Not 5000\n");
    }

    clr(5000);
    if(test(5000)) {
        printf("5000\n");
    }else{
        printf("Not 5000\n");
    }

    return 0;
}


3. 参考
阅读(1688) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-09 16:29:12

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com