问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定 n<=10^12
样例解释:n=1000=2^353,p=2*5=10
解析;
质因数的分解时候很简单的了,我们三化五除二的就可以把一个数分的透透,O(∩_∩)O哈哈~。难点就是如题目表示的“去重”,怎样可以避免将同一个质因子重复想乘的问题。我的程序的思路是从2开始除,不回头,每当碰到一个可以被整除的数,就对他进行判断,是否前面已经有这个质因子了.最简单的检验就是用这个数把他前面的所有数都除一遍,若能够将前面的一个数整除,那么n肯定也能将这个数整除,而且人家还在他前面,所以此时这个数就要舍弃了,不能给p乘。但是这种方法很耗时间。所以可以改进一下,就是用这个数数和他前面的数的平方相比较,这样就可以节省时间了。
这边插个图对比一下,两种方法耗时的差距
上面一个就是用第一种,下面是改进后的耗时,可以看出,时间的差距还是挺大的
#include <stdio.h>
int Lnode(long long n){
long long i;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main(){
long long n,p=1,i;
scanf("%lld",&n);
for(i=2;i<=n;i++){
if(n%i==0&&Lnode(i)){
p=p*i;
n=n/i;
}
}
printf("%lld",p);
return 0;
}