算法训练 素因子去重

问题描述

给定一个正整数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;
}
原文地址:https://www.cnblogs.com/AlexKing007/p/12338428.html