分解质数相乘——记一次有技术含量的笔试骗A

9.4号做了一套兴业银行的笔试题,其中编程题的要求是这样的:输入一个数,输出这个数由质数相乘的表达式,例如

456=2*2*2*3*19,132=2*2*3*11,并且质数要从小打到大排列

做这道题之前我从来没有接触过质数的问题,但是我想,将一个数分解成由质数相乘,那我写一个质数数组,然后逐个相除判断,如果能够整除一个质数,那么就记录下来,经过整除判断循环以后输入数变为1,就完成了

我的第一版代码是这样的:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        printAns(n);
    }

    private static void printAns(int n) {
        //自己构造的一个质数数组,范围有限,能够A就行了
        int[] num = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 39, 41, 43};
        //记录最开始的数
        int param = n;
        List<Integer> ans = new ArrayList<>();
        //n == 1时说明操作完成
        while (n != 1) {
            for (int divide : num) {
                if (n % divide == 0) {
                    //如果能够整除,用list记录
                    ans.add(divide);
                    //更新n
                    n /= divide;
                }
            }
        }
        //对质数进行排序
        Collections.sort(ans);
        StringBuilder sb = new StringBuilder();
        sb.append(param).append("=");
        for (int number : ans) {
            sb.append(number).append("*");
        }
        sb.deleteCharAt(sb.length() - 1);
        System.out.println(sb);
    }
}

这一版代码只能够A83,因为忽略了输入本身就是一个质数的情况,例如13=1*13

修改之后就能够全A了

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        printAns(n);
    }

    private static void printAns(int n) {
        int[] num = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 39, 41, 43};
        //记录最开始的数
        int param = n;
        List<Integer> ans = new ArrayList<>();
        while (n != 1) {
            for (int divide : num) {
                //如果输入就是质数,直接输出
                if (param == divide) {
                    System.out.println(param + "=1*" + param);
                    return;
                }
                //其余的操作和第一版一样
                if (n % divide == 0) {
                    ans.add(divide);
                    n /= divide;
                }
            }
        }
        Collections.sort(ans);
        StringBuilder sb = new StringBuilder();
        sb.append(param).append("=");
        for (int number : ans) {
            sb.append(number).append("*");
        }
        sb.deleteCharAt(sb.length() - 1);
        System.out.println(sb);
    }
}
上一篇:2018年下半年 网络工程师 下午试卷 案例 软考真题【含答案和解析】


下一篇:BigDecimal 方法使用