算法训练 素因子去重 (循环,分支)

 算法训练 素因子去重  

时间限制: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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42794545/article/details/87965832