素因子去重

素因子去重

题解:这题主要是两步
1.找素因子——我这里用了快速查找一个数的素因子的方法
(①先找出在数中彻底去除2这个因子)
②直接在奇数中寻找n的因子 i ,并彻底去除所有 i 的倍数的因子,这样就不用判断 i 是否为素数了,非常之妙!)
(③为了防止n是个大素数的情况出现,最后还要加一个判断)

2.去重——利用set容器

以下为完整代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	set<int>alpm;
	long long n;
	cin>>n;
	while(n%2==0){      //先去除2这个因子 
		alpm.insert(2);
		n/=2;
	}

	for(int i = 3;i<=sqrt(n);i+=2){  //这里是i+=2,因为已经去除偶数因子了 
		while(n%i==0){               //除去i的所有i的倍数的因子 
			alpm.insert(i);
			n/=i;
		}
	}
	if(n>2) alpm.insert(n);   //防止n是个大素数的情况出现 
	int ans = 1;
	for(set<int>::iterator it = alpm.begin();it!=alpm.end();it++){
		ans=ans*(*it);
	}
	cout<<ans<<endl; 
	return 0;
}