算法训练 素因子去重
问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=1012
样例解释:n=1000=2353,p=25=10
分析
对n分解质因数,应该找到一个最小的质数k,然后按下述步骤完成:
1.如果这个质数恰等于n,则说明分解质因数的过程已结束,打印出即可;
2.如果n!=k,但n能被k整除,则打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步;
2.如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
将求出的质因子放到一个数组中保存,数组下标表示该质因子,数组的值为0或1,为1表示有该质因子,最后读取该数组的值,将为1的元素下标相乘。
代码
#include <iostream>
using namespace std;
bool num[4000000];
int main()
{
int k=2;
long long n,ans=1;
cin>>n;
if (n==2)
{
cout<<n;
return 0;
}
while (k<=n)
{
if (k==n)
{
num[k]=true;
break;
}
else if (n%k==0)
{
num[k]=true;
n=n/k;
}
else k++;
}
for (int i = 2; i <= n; ++i)
if (num[i]) ans*=i;
cout<<ans<<endl;
return 0;
}