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);
}
}