目录
一、素数判断:
定义:大于1且仅能被1和自身整除的整数为素数(质数)。
一、暴力求解法
对于数字n,直接从2到n-1,逐一试除,一旦被整除则不是素数,但要注意2也是素数。
bool isPrime_1(int n)
{
if (n == 2) //2需要单独判断
return true;
for (int i = 2; i < n; i++)
{
if (n%i == 0)
return false;
}
return true;
}
二、对判断范围优化
对于数字n,如果在n^(1/2)之前(包括n^(1/2))就被整除,则n也必被整除.这样缩小了范围,提高了效率。
bool isPrime_2(int n)
{
if (n == 2)
return true;
for (int i = 2; i <=sqrt(n); i++)
{
if (n%i == 0)
return false;
}
return true;
}
三、对数字做判断优化
我们知道,除2以外的所有偶数必不是素数。那么可以这样优化。
bool isPrime_3(int n)
{
if (n == 2)
return true;
if (n % 2 == 0)
return false;
for (int i = 3; i <= sqrt(n); i += 2)//跳过偶数
{
if (n%i == 0)
return false;
}
return true;
}
这样效率就大大提升了。
四、用六判断
bool isPrime_4(int n)
{
if (n <= 3) //小于3且大于一
return n > 1;
if (n % 6 != 1 && n% 6 != 5)
return false;
for (int i = 5; i <= sqrt(n); i += 6)
{
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
对大于大于五的数,有6n+1,6n+2,6n+3,6n+4,6n+5,其中6n+2,6n+3,6n+4皆有第三个数可以让其整除,所有当n%6不为1或5时不为素数,而25前的数开根后比5小以已被判断完毕,进入循环后加一步n%(i+2)表示可被3整除的,也就是方法3的进一步扩展。
目前暂未深入学习数据结构与算法,还有更高效率的方法用于判断。感兴趣的可以自行探索.
二、最小公倍数
定义:最小公倍数*最大公约数=两数之积
一、辗转相除法
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
二、穷举法
int gcd(int a,int b)
{
a=max(a,b);
b=min(a,b);
int tmp=a;
while(a%b!=0)
{
a+=tmp;
}
return a;
}
三、更相减损法
int gcd(int m,int n)
{
int i=0,temp,x;
while(m%2==0 && n%2==0)
{
m/=2;
n/=2;
i+=1;
}
if(m<n)
swap(m,n);
while(x)
{
x=m-n;
m=(n>x)?n:x;
n=(n<x)?n:x;
if(n==(m-n))
break;
}
if(i==0)
return n;
else
return (int )pow(2,i)*n;
}