vivo2020春招试题二——数位之积

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=2k23k35k57k7表示的正整数均不存在对应的 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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值