d是n的约数,则n/d也是n的约数,min(d,n/d)<=√n(n开方),所以只需要检查2~√n
bool is_prime(int n)
{
for(int i=2;i*i<=n;++i)//=不能少
{
if(n%i==0) return false;
}
return n!=1; //1和2,3不经历上面的循环,2和3在此测试下为素数,1只有一个约数,不是素数
}
约数枚举:
1 vector<int> divisor(int n) 2 { 3 vector<int> res; 4 for (int i = 1; i*i <= n; ++i) 5 { 6 if (n%i == 0) { 7 res.push_back(i); 8 if (i != n / i) res.push_back(n / i); 9 } 10 } 11 }
整数分解:规定2为最小的质因子,1不是,因为1可以重复相乘,这样整数分解形式不唯一;先找出第一个质因子,再寻找n/i的质因子,此时仍然从i找起,所以需要--i,循环执行了++i,下一次寻找i还是原来的值
vector<int> Prime_factor(int n)
{
vector<int> res;
//int m=sqrt(n);
for (int i = 2; i<=n; ++i)//第一个能整除的数最小,是质因数,如2,3,4就不是,5,6不是,9也不是,15的质因数为3*5
{
if (n%i == 0) { res.push_back(i); n /= i; --i; }
}
return res;
}
map<int, int> prime_factor(int n)
{
map<int, int> res;
for (int i = 2; i*i <= n; ++i)
{
while (n%i == 0)
{
++res[i];
n / = i;
}
}
if (n != 1) res[n] = 1;
return res;
}