算法训练 素因子去重
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^3*5*3,p=2*5=10
//自我练习,运行超时版,得分 70
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sca=new Scanner(System.in);
long n,m=0;
n=sca.nextLong();
m=Todo(n);
System.out.println(m);
}
public static long Todo(long n){
long m=1;
int flag=0;
for(int i=2;i<=n;i++) {
flag=0;
for(int j=3;j<i/2;j++) {
if(i%j==0) {
flag=1;
}
}
while(n%i==0&&n!=0) {
n=n/i;
if(flag==0) {
m=m*i;
flag=1;
}
}
if(n==0) {
break;
}
}
return m;
}
}
//百度,满分版
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//素因子去重
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
long n=scanner.nextLong(); //这里用long存储
int result=1;
List<Integer> list=new ArrayList<Integer>(); //定义一个集合,数组不好定义长度
for(int i=2;i<n;i++) {
if(n%i==0) {
list.add(i);
n=n/i;
while(n%i==0) { //这里就是实现因子去重
n=n/i;
}
}
if(n<i) { //当n<i的时候就可以跳出循环了
break;
}
}
list.add((int) n);
for(int num: list) { //遍历集合
result=result*num;
}
System.out.println(result);
}
}
分析:第一版和第二版的差别在于,第二版没有想第一版那样每一次对i进行判断是否为质因子。所以说我对质因子的理解还不够透彻。下面来分析质因子。
质因数分解:
把一个合数分解成若干个质因数的乘积的形式,即求质因数的过程叫做分解质因数。
分解质因数只针对合数。(分解质因数也称分解素因数)求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式叫短除法,和除法的性质差不多,还可以用来求多个个数的公因式。
注意:当从最小质因子去重之后后面较小的非质数就不可能成为他的因子。所以说最后他的因子都是质数。
由此得出自我编程第三版:满分版
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sca=new Scanner(System.in);
long n,m=0;
n=sca.nextLong();
m=Todo(n);
System.out.println(m);
}
public static long Todo(long n){
long m=1;
for(int i=2;i<=n;i++) {
if(n%i==0&&n!=0) {
m=m*i;
while(n%i==0) {
n=n/i;
}
}
if(n==0) {
break;
}
}
return m;
}
}