华为机试-HJ6 质数因子

199 阅读1分钟

题目

image.png

www.nowcoder.com/practice/19…

参考题解

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        long num = scanner.nextLong();

        for (long i = 2; i <= num; ++i) {
            while (num % i == 0) {
                System.out.print(i + " ");
                num /= i;
            }
        }
        System.out.println();
    }
}

image.png

总结:

1、num % i == 0 表示 num可以整除i

2、没啥说的新思路

        long num = 1000;
        for (long i = 2; i <= num; i++) {
            while (num % i == 0) {
                num /= i;
            }
        }

题解修正

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        long num = scanner.nextLong();
        long k = (long) Math.sqrt(num);

        for (long i = 2; i <= k; ++i) {
            while (num % i == 0) {
                System.out.print(i + " ");
                num /= i;
            }
        }
        System.out.println(num == 1 ? "" : num);
    }
}

总结:

1、数学技巧:没必要循环num次、num取平方根就可以了

2、System.out.println(num == 1 ? "" : num); 1既不是质数也不是合数、输入1没有质数整除就返回本身、过了num平方根以后还没有质数、那就返回它本身

3、 for循环+ while循环组合理解成一把钥匙去开锁、能开再开下一个、打不开就换下一把钥匙

image.png

高效题解

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = br.readLine()) != null) {
            int num = Integer.parseInt(str);
            long k = (long) Math.sqrt(num);

            for (long i = 2; i <= k; ++i) {
                while (num % i == 0) {
                    System.out.print(i + " ");
                    num /= i;
                }
            }
            System.out.println(num == 1 ? "" : num);
        }
    }
}

image.png

总结:

1、 BufferedReader一替换Scanner瞬间优化20多ms