问题描述
素数就是指在一个大于1的自然数中,仅能被1和它自身整除的整数。判定一个整数n是否为素数就是要判定整数n能否被除1和它自身之外的任意整数整除,若都不能整除,则n为素数。
这个算法实现起来很简单,主要目的是为了体会算法时间复杂度,要时刻注意优化算法,这在实际应用中非常重要。
问题解析
接口设计:判断一个整数(参数)是否为素数(质数),如果是质数,则返回1,否则返回0。
方法1:根据概念判断。判定一个整数n是否为素数就是要判定整数n能否被除1和它自身之外的任意整数整除,若都不能整除,则n为素数。时间复杂度O(n)。
int IsPrimeNumber(int n)
{
int j;
if( n<2 )
{
return 0;
}
for(j=2;j<n;j++)
{
if(n%j==0)
{
break;
}
}
if(j==n)
{
return 1;
}
else
{
return 0;
}
}
方法2:减小问题规模。判定一个整数n是否为素数,除了2以外的偶数肯定不是素数,因此可以跳过,只需判断奇数是否为素数。这样,判断素数的外循环次数可以减少1/2。时间复杂度O(n/2), 速度提高一倍。
int IsPrimeNumber(int n)
{
int j;
if( n<2 )
{
return 0;
}
//验证偶数
if( n==2 )
{
return 1;
}
else if( n%2==0 )
{
return 0;
}
//验证奇数
for(j=3;j<n;j+=2)
{
if(n%j==0)
{
break;
}
}
if(j==n)
{
return 1;
}
else
{
return 0;
}
}
方法3:减小问题规模。判定一个整数n是否为素数,不需要用偶数去测试,而且不需要测试到n,只需要测试到n的平方根就可以了,这样内循环的次数又进一步减少了。时间复杂度O(sqrt(n)/2), 速度提高O((n-sqrt(n))/2)。
int IsPrimeNumber(int n)
{
int j;
if( n<2 )
{
return 0;
}
//验证偶数,第一种形式
if( n==2 )
{
return 1;
}
else if( n%2==0 )
{
return 0;
}
//验证偶数,第二种形式
/* if( n%2==0 )
{
if(n==2)
{
return 1;
}
return 0;
}*/
//验证奇数,第一种形式
/* int k=int(sqrt(double(n)));
for(j=3;j<=k;j+=2)
{
if(n%j==0)
{
break;
}
}
if(j>k)
{
return 1;
}
else
{
return 0;
}*/
//验证奇数,第二种形式
/* for(j=3;j*j<=n;j+=2)
{
if(n%j==0)
{
break;
}
}
if(j*j>n)
{
return 1;
}
else
{
return 0;
}*/
//验证奇数,第三种形式
for(j=3;j*j<=n;j+=2)
{
if(n%j==0)
{
return 0;
}
}
return 1;
}