素数

/*

    今天去国内某大型通讯企业面试,不过在最终的薪资上双方没有找到平衡,看来只有BAT这样的才能给出理想的待遇...此次技术面试倒是较为简单,其中编程题是关于素数的,给出一个较为简易的解决代码。程序的思想就不介绍了,一看便知...

    Ps: 程序员面试这个谈吐还是很重要啊,码农那么多,如何构建自己的个人价值是个难度极大的活..

    修订:

        修改了之前程序中的BUG,这个故事充分说明了程序容不下半点马虎

        增加了筛选法求素数

*/


#include "stdio.h"
#include "string.h"
#include "math.h"
#include <iostream>


bool IsPrime( int data )
{
    bool ret = false;
    if ( data > 1 )
    {
        int end = sqrt(data);
        ret = true;
        for ( int i=2; i<=end; ++i )
        {
            if ( 0 == (data%i) )
            {
                ret = false;
                break;
            }
        }
    }
    return ret;
}

void PrintPrime(int num)
{

    if ( num > 1 )

    {
        std::cout << 2 << endl;
    }
    for ( int i=3; i<=num; i+=2 )
    {
        if ( IsPrime(i) )
        {
            std::cout << i;
std::cout << std::endl;
        }
    }
}
void Test()
{
    PrintPrime(50);
}


/*
筛选法求素数
用位数组来标识素数,这里假设定义的char型数组
*/
#define ARRAYSIZE 8
//位数组长度
#define BITARRAYSIZE(size) ( (size+ARRAYSIZE-1)/ARRAYSIZE )
//位数组位置
#define BITARRAYPOS(pos) ( (pos)/ARRAYSIZE )
//位数组偏移
#define BITARRAYOFT(pos) ( (pos)%ARRAYSIZE )
//设置位数组arr的pos位
#define BITARRAYSET(arr, pos) ( arr[BITARRAYPOS(pos)] |= (1<<BITARRAYOFT(pos)) )
//检测位数组arr的pos位
#define BITARRAYTEST(arr, pos) ( arr[BITARRAYPOS(pos)] & (1<<BITARRAYOFT(pos)) )


int main(int argc, char* argv[])
{
    char baArray[BITARRAYSIZE(50)];
    memset(baArray, 0, sizeof(baArray));
    for ( int i=2; i<50; ++i )
    {
        if ( !BITARRAYTEST(baArray, i) )
        {
            printf("%d\n", i);
            for ( int j=i; j<50; j+=i )
            {
                BITARRAYSET(baArray, j);
            }
        }
    }
    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
    Test();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值