质数(素数)
1.质数的判定——试除法
(1)暴力解法
(2)优化解法
2.分解质因数——试除法
(1)暴力解法
(2)优化解法
质数(素数)
在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,也叫做素数。
1.质数的判定——试除法
(1)暴力解法
质数判定的最简单的求法,从质数的定义出发,时间复杂度为O(n),效率较低.
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
bool is_prime(int x)
{
if(x<2)
return false;
for(int i=2;i<x;i++)
{
if(x%i==0)
{
return false;
}
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
if(is_prime(x))
puts("Yes");
else
puts("No");
}
return 0;
}
(2)优化解法
(打字说不清,就写在纸上啦~~)
如上图所讲,根据质数的这一性质,对暴力解法进行优化,时间复杂度降为O(sqrt(n)),但要注意一个细节(下图)。
时间复杂度肯定为O(sqrt(n)).
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
bool is_prime(int x)
{
if(x<2)
return false;
for(int i=2;i<=x/i;i++) //注意i<=x/i这个细节
{
if(x%i==0)
{
return false;
}
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
if(is_prime(x))
puts("Yes");
else
puts("No");
}
return 0;
}
/*模板
bool is_prime(int x)
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
return false;
return true;
}
*/
2.分解质因数——试除法
(1)暴力解法
#include <iostream>
#include <algorithm>
using namespace std;
void divide(int x)
{
for(int i=2;i<=x;i++)
{
if(x%i==0) //只要条件成立,i一定是质数
{
int s=0;
while(x%i==0)
{
x/=i;
s++;
}
printf("%d %d\n",i,s);
}
}
puts("");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
divide(x);
}
return 0;
}
(2)优化解法
#include <iostream>
#include <algorithm>
using namespace std;
void divide(int x)
{
for(int i=2;i<=x/i;i++)
{
if(x%i==0)
{
int s=0;
while(x%i==0)
{
x/=i;
s++;
}
printf("%d %d\n",i,s);
}
}
if(x>1)
printf("%d %d\n",x,1);
puts("");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
divide(x);
}
return 0;
}
/*模板
void divide(int x)
{
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
{
int s = 0;
while (x % i == 0) x /= i, s ++ ;
cout << i << ' ' << s << endl;
}
if (x > 1) cout << x << ' ' << 1 << endl;
cout << endl;
}
*/