数位之积程序是一个算法,用于寻找并输出一个最小的正整数 \( m \)(\( m > 9 \)),使得 \( m \) 的各位数字(个位、十位、百位等)之积等于给定的正整数 \( n \)。如果不存在这样的 \( m \),则输出 -1。
算法思路
大数放后,小数放前 :从 \( n \) 开始累加,然后转化为字符数组,计算各位数字的乘积。不断取余:
通过不断取余操作,逐步缩小数字范围,直到找到满足条件的最小 \( m \) 或确定不存在这样的 \( m \)。
代码实现
```java
import java.util.*;
public class Solution {
public int solution(int n) {
int a = n;
while (true) {
char[] arr = Integer.toString(a).toCharArray();
int m = 1;
for (char s : arr) {
m *= (s - '0');
}
if (m > 6 * n) return -1; // 如果乘积过大,直接返回 -1
else if (m == n) return a; // 如果乘积等于 n,返回当前数字 a
a++;
}
}
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.solution(36)); // 输出 49
System.out.println(sol.solution(100)); // 输出 455
}
}
```
解释
初始化:
从 \( n \) 开始,将 \( a \) 赋值为 \( n \)。
循环:
在循环中,将 \( a \) 转化为字符数组,计算各位数字的乘积 \( m \)。
判断
如果 \( m \) 大于 \( 6 \times n \),则直接返回 -1,因为 \( m \) 的各位数字乘积不可能超过 \( 6 \times n \)。
如果 \( m \) 等于 \( n \),则返回当前的 \( a \)。
否则,将 \( a \) 加 1,继续循环。
优化
另一种优化方法是因式分解法,通过彻底分解 \( n \) 来判断是否存在满足条件的 \( m \)。如果 \( n \) 有大于 9 的因子,则一定不存在满足条件的 \( m \)。
```java
public int solution(int n) {
int arr[] = new int; // 2~9用于存放因子个数
for (int i = 2;; i++) {
if (n == 1) break; // 完成因式分解
if (i > 9) return -1; // 有大于9的因子,返回-1,结束
if (n % i == 0) {
arr[i]++; // 因子数量+1
n = n / i; // 除去因子
}
}
// 根据因子个数重新构造 m
int m = 1;
for (int i = 2; i < 10; i++) {
while (arr[i] > 0) {
m *= i;
arr[i]--;
}
}
return m;
}
```
总结
数位之积程序通过不同的方法寻找满足条件的最小正整数 \( m \),并输出其各位数字的乘积。暴力法通过累加和字符数组计算乘积,而因式分解法通过分解 \( n \) 的因子来优化计算过程。