这里copy别人的解析:http://www.cnblogs.com/skyaspnet/archive/2010/10/26/1861194.html
怎么判断一个数是否为素数?
笨蛋的作法:
bool IsPrime(unsigned n)
{
if
(n<2)
{
//小于2的数即不是合数也不是素数
throw
0;
}
for
(unsigned i=2;i<n;++i)
{
//和比它小的所有的数相除,如果都除不尽,证明素数
if (n%i==0)
{//除尽了,则是合数
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;
// 都没除尽,素数
}
一个合数必然可以由两个或多个质数相乘而得到。那么如果一个数不能被比它的一半小的所有的质数整除,那么比它一半小的所有的合数也一样不可能整除它。建立一个素数表是很有用的。
下面是中学生的做法:
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;
}
}