素数

素数判断与整数分解
本文介绍了一种高效的素数判断方法,并给出了详细的代码实现。同时,文章还提供了两种整数分解的方法,包括约数枚举和质因数分解,并通过具体的C++代码示例加以说明。

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;
}

  

 

转载于:https://www.cnblogs.com/hchacha/p/6678590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值