题目:算法训练 素因子去重
问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^3*5^3,p=2*5=10
代码:
#include<iostream>
using namespace std;
int main(){
long long n;
cin>>n;
long long re=1;
int i=2;
while(n!=1){
if(n%i==0) re*=i;
while(n%i==0) {
n=n/i;
}
i++;
}
cout<< re<<endl;
return 0;
}
总结:
1.无需建立数组,数组无论置于堆空间,还是堆空间,都会占用很大的内存。
2.无需判断是否为素数,如果了解判断素数的筛选法就可轻易理解。
例如找寻第100002个素数是多少
#include<iostream>
using namespace std;
#define N 10000000
int a[N];
int main(){
int x=100001;
for(int i=2;i<N/2;i++){
if(a[i]==1) continue;
for(int k=2;k<=N/i;k++){
if(i*k<N) a[i*k]=1;
}
}
int m=0;
for(int i=2;i<N;i++){
if(a[i]==0){
m++;
if(m==x) cout<<i;
}
}
return 0;
}