设为首页 加入收藏

TOP

判断一个数是否为素数(四)
2013-07-23 09:09:03 来源: 作者: 【 】 浏览:2039
Tags:判断 一个数 是否 素数


    2)下面是小学生的做法:
    [cpp]
    bool IsPrime(unsigned n)
    {
    if (n<2)
    {
    //小于2的数即不是合数也不是素数
    throw 0;
    }
    for(unsigned i=2;i<n/2+1;++i)
    {
    // 和比它的一半小数相除,如果都除不尽,证明素数
    if ( 0 == n % i )
    {
    // 除尽了,合数
    return false;
    }
    }
    return true; // 都没除尽,素数
    }
    bool IsPrime(unsigned n)
    {
    if (n<2)
    {
    //小于2的数即不是合数也不是素数
    throw 0;
    }
    for(unsigned i=2;i<n/2+1;++i)
    {
    // 和比它的一半小数相除,如果都除不尽,证明素数
    if ( 0 == n % i )
    {
    // 除尽了,合数
    return false;
    }
    }
    return true; // 都没除尽,素数
    }
    一个合数必然可以由两个或多个质数相乘而得到。那么如果一个数不能被比它的一半小的所有的质数整除,那么比它一半小的所有的合数也一样不可能整除它。建立一个素数表是很有用的。
    3)下面是中学生的做法:
    [cpp]
    bool IsPrime2(unsigned n)
    {
    if ( n < 2 )
    { // 小于2的数即不是合数也不是素数
    throw 0;
    }
    static unsigned aPrimeList[] = { // 素数表
    1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
    43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 113,
    193, 241, 257, 337, 353, 401, 433, 449, 577, 593, 641,
    673, 769, 881, 929, 977, 1009, 1153, 1201, 1217, 1249,
    1297,1361, 1409, 1489, 1553, 1601, 1697, 1777, 1873,
    1889, 2017, 2081, 2113, 2129, 2161, 2273, 2417, 2593,
    2609, 2657, 2689, 2753, 2801, 2833, 2897, 3041, 3089,
    3121, 3137, 3169, 3217, 3313, 3329, 3361, 3457, 3617,
    3697, 3761, 3793, 3889, 4001, 4049, 4129, 4177, 4241,
    4273, 4289, 4337, 4481, 4513, 4561, 4657, 4673, 4721,
    4801, 4817, 4993, 5009, 5153, 5233, 5281, 5297, 5393,
    5441, 5521, 5569, 5857, 5953, 6113, 6257, 6337, 6353,
    6449, 6481, 6529, 6577, 6673, 6689, 6737, 6833, 6961,
    6977, 7057, 7121, 7297, 7393, 7457, 7489, 7537, 7649,
    7681, 7793, 7841, 7873, 7937, 8017, 8081, 8161, 8209,
    8273, 8353, 8369, 8513, 8609, 8641, 8689, 8737, 8753,
    8849, 8929, 9041, 9137, 9281, 9377, 9473, 9521, 9601,
    9649, 9697, 9857
    };
    const int nListNum = sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数
    for (unsigned i=2;i<nListNum;++i )
    {
    if(n/2+1<aPrimeList[i])
    {
    return true;
    }
    if(0==n%aPrimeList[i])
    {
    return false;
    }
    }
    /*由于素数表中元素个数是有限的,那么对于用素数表判断不到的数,就只有用笨蛋办法了*/
    for (unsigned i=aPrimeList[nListNum-1];i<n/2+1;i++ )
    {
    if (0==n%i)
    {
    // 除尽了,合数
    return false;
    }
    }
    return true;
    }
    bool IsPrime2(unsigned n)
    {
    if ( n < 2 )
    { // 小于2的数即不是合数也不是素数
    throw 0;
    }
    static unsigned aPrimeList[] = { // 素数表
    1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
    43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 113,
    193, 241, 257, 337, 353, 401, 433, 449, 577, 593, 641,
    673, 769, 881, 929, 977, 1009, 1153, 1201, 1217, 1249,
    1297,1361, 1409, 1489, 1553, 1601, 1697, 1777, 1873,
    1889, 2017, 2081, 2113, 2129, 2161, 2273, 2417, 2593,
    2609, 2657, 2689, 2753, 2801, 2833, 2897, 3041, 3089,
    3121, 3137, 3169, 3217, 3313, 3329, 3361, 3457, 3617,
    3697, 3761, 3793, 3889, 4001, 4049, 4129, 4177, 4241,
    4273, 4289, 4337, 4481, 4513, 4561, 4657, 4673, 4721,
    4801, 4817, 4993, 5009, 5153, 5233, 5281, 5297, 5393,
    5441, 5521, 5569, 5857, 5953, 6113, 6257, 6337, 6353,
    6449, 6481, 6529, 6577, 6673, 6689, 6737, 6833, 6961,
    6977, 7057, 7121, 7297, 7393, 7457, 7489, 7537, 7649,
    7681, 7793, 7841, 7873, 7937, 8017, 8081, 8161, 8209,
    8273, 8353, 8369, 8513, 8609, 8641, 8689, 8737, 8753,
    8849, 8929, 9041, 9137, 9281, 9377, 9473, 9521, 9601,
    9649, 9697, 9857
    };
    const int nListNum = sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数
    for (unsigned i=2;i<nListNum;++i )
    {
    if(n/2+1<aPrimeList[i])
    {
    return true;
    }
    if(0==n%aPrimeList[i])
    {
    return false;
    }
    }
    /*由于素数表中元素个数是有限的,那么对于用素数表判断不到的数,就只有用笨蛋办法了*/
    for (unsigned i=aPrimeList[nListNum-1];i<n/2+1;i++ )
    {
    if (0==n%i)
    {
    // 除尽了,合数
    return false;
    }
    }
    return true;
    } 

            

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇引用计数的智能指针shared_ptr 下一篇C++ 函数声明中指定,默认参..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: