素数

判断素数:

0,1不是素数,素数就是只能被1和本身整除的数

判断n是否为素数,只需判断1,2,3...sqrt(n)能不能整除n,因为sqrt(n)是n最大的因子

bool is_prime(int n)
{
    if(n==1||n==0)return false;
    int i;
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0)return false;
    }
    return true;
}

素数筛

原理:2的倍数不是素数,3的倍数不是素数,(4是2的倍数,已被排除),5的倍数不是素数,(6已被排除),7的倍数不是素数,(8,9,10已被排除)....

为了初始化方便,用0表示是素数,1表示不是素数,先假设所有数都是素数,再逐个排除

int is_prime[1000010];
void inti()
{
    memset(is_prime,0,sizeof(is_prime));
    is_prime[0]=is_prime[1]=1;
    int i,j;
    for(i=2;i<1000010;i++)
    {
        for(j=i+i;j<1000010;j+=i)is_prime[j]=1;
    }
}

 

练习:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1012

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1312

 

memset用法:

原型:void *memset(void *s,int c,size_t n) 
头文件:string.h 或者cstring
作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
例子: 
int arr[100000];
memset(arr,0,sizeof(arr));
memset(arr,-1,sizeof(arr));
注意:
memset只能赋值0或-1
只有0和-1可以。或者说,只有memset 0和-1会分别初始化为0和-1。。
memset是一个一个char来set的。0相当于0x00,-1相当于0xff,1相当于0x01。
因此,
memset 0,每个元素都是0x00000000。
memset -1,每个元素都是0xffffffff。
memset 1,每个元素都是0x01010101,即16843009。

对unsigned int的数组,
memset 0,初始化为最小值0。
memset -1,初始化为最大值0xffffffff,即4294967295。

对int的数组,
memset 0,初始化为0。
memset -1,初始化为0xffffffff,即-1。
memset 0x7f,初始化为0x7f7f7f7f,即2139062143(int的最大值是0x7fffffff,即2147483647)。
memset 0x80,初始化为0x80808080,即-2139062144(int的最小值是0x80000000,即-2147483648)。

 

posted on 2015-03-22 15:34  kylehz  阅读(139)  评论(0)    收藏  举报