vivo2020春招试题二——数位之积
题目来自牛客网,感谢!
给定任意正整数n,输出一个正整数m,使得m各位之积为n,且m为满足该条件的最小正整数。若不存在则输出-1。
输入格式
第一行输入n。
输出格式
第一行输出m,或当m不存在时输出-1。
输入范例
36
输出范例
49
首先想到将
n
n
n质因数分解,考虑到单位数(即
<
10
<10
<10)的质数只存在2、3、5、7,从而任意不以
n
=
2
k
2
⋅
3
k
3
⋅
5
k
5
⋅
7
k
7
n=2^{k_2}·3^{k_3}·5^{k_5}·7^{k_7}
n=2k2⋅3k3⋅5k5⋅7k7表示的正整数均不存在对应的
m
m
m。质因数分解,并以数组
K
K
K保存
k
2357
k_{2357}
k2357。
对指数数组
K
K
K,采用消去法:
- 每存在2个 k 3 k_3 k3消去并生成一个 9 9 9
- 每存在3个 k 2 k_2 k2消去并生成一个 8 8 8
- 每存在1个 k 7 k_7 k7消去并生成一个 7 7 7
- 每存在1个 k 2 k_2 k2与1个 k 3 k_3 k3消去并生成一个 6 6 6
- 每存在1个 k 5 k_5 k5消去并生成一个 5 5 5
- 每存在2个 k 2 k_2 k2消去并生成一个 4 4 4
- 每存在1个 k 3 k_3 k3消去并生成一个 3 3 3
- 每存在1个 k 2 k_2 k2消去并生成一个 2 2 2
我的代码实现
import java.util.Scanner;
public class MinNum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
sc.close();
int[] num = resolve(x);
if (num[0] == -1) {
System.out.println(-1);
return;
}
String n = "";
while (!isEmpty(num)) {
if (num[1] >= 2) {
num[1] -= 2;
n += "9";
continue;
}
if (num[0] >= 3) {
num[0] -= 3;
n += "8";
continue;
}
if (num[3] >= 1) {
num[3]--;
n += "7";
continue;
}
if (num[0] >= 1 && num[1] >= 1) {
num[0]--;
num[1]--;
n += "6";
continue;
}
if (num[2] >= 1) {
num[2]--;
n += "5";
continue;
}
if (num[0] >= 2) {
num[0] -= 2;
n += "4";
continue;
}
if (num[1] >= 1) {
num[1]--;
n += "3";
continue;
}
if (num[0] >= 1) {
num[0]--;
n += "2";
continue;
}
}
System.out.println(new StringBuffer(n).reverse());
}
public static int[] resolve(int x) {
int[] num = new int[4]; // num[0-3]分别指示x的质因数分解过程中2、3、5、7的幂
int[] p = { 2, 3, 5, 7 };
for (int i = 0; i < 4; i++) {
num[i] = 0;
while (x % p[i] == 0) {
num[i]++;
x /= p[i];
}
}
if (x != 1)
num[0] = -1;
return num;
}
public static boolean isEmpty(int[] a) {
for (int i = 0; i < 4; i++)
if (a[i] != 0)
return false;
return true;
}
}