质因数分解

内容纲要

质因数分解

题目描述

已知正整数 $n$ 是两个不同的质数的乘积,试求出较大的那个质数。

输入格式

输入只有一行,包含一个正整数 $n$($6<n<10^9$)。

输出格式

输出只有一行,包含一个正整数 $p$,即较大的那个质数。

样例 #1

样例输入 #1

21

样例输出 #1

7

Answer

找出所有质数因子:从最小的质数2开始,检查每个数是否是n的因子,即n能否被这个数整除。如果能,那么这个数就是n的一个质数因子。

判断是否为质数:在找到每个因子的时候,还需要判断这个因子是否为质数。实际上,如果按照从小到大的顺序找因子,那么每找到一个因子,它一定是质数,因为如果它不是质数,那么它的质数因子会在它之前就被找到,此时它就不会被识别为n的因子。

找到较大的质数:由于n是两个不同质数的乘积,一旦找到第一个质数因子,即可通过n除以这个质数因子得到另一个质数因子,比较这两个质数因子的大小即可找到较大的那个。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextInt();
        long p = 0;
        for (long i = 2; i <=n; i++) {
            if (n%i==0){
                p = n/i;
                break;
            }else {
                p = n;
            }
        }
        System.out.println(p);
    }
}
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); //n=x/ln(x)
        int nn = (int) ((Math.ceil(Math.log(n)*n))*1.3);
        boolean[] x = new boolean[nn];
        Arrays.fill(x, true);
        for (int i = 2; i < nn; i++) {
            if(x[i]){
                for (int j = 2; i*j < nn; j++) {
                    x[i*j] = false;
                }
            }
        }
        int sum = 0;
        for (int i = 2; i < nn; i++) {
            if (x[i]){
                sum++;
            }
            if (sum==n){
                System.out.println(i);
                break;
            }
        }
    }
}

可参考:http://101.43.120.151/archives/362

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注