1. 程式人生 > >京東軟開2015筆試:尋找滿足條件的整數

京東軟開2015筆試:尋找滿足條件的整數

依據 -m 取值 math -1 name bsp com integer

題目大意:

給出整數N(0 ≤ N ≤ 10^9),找出一個最小的整數Q,使得將Q的每一位相乘之後等於N


比如N=18,則Q可能取值為:29(2×9=18),36(3×6=18),63(6×3=18),92(9×2=18)


那麽我們僅僅要取最小值29即為結果 輸入:整數N(0 ≤ N ≤ 10^9) 輸出:假設存在這種Q,則輸出Q。假設不存在,輸出-1


package com.liuhao.acm.exam;

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

/**
 * @author liuhao 給出整數N(0 ≤ N ≤ 10^9),找出一個最小的整數Q,使得將Q的每一位相乘之後等於N
 *         比如N=18,則Q可能取值為:29(2×9=18),36(3×6=18),63(6×3=18),92(9×2=18)
 *         那麽我們僅僅要取最小值29即為結果 輸入:整數N(0 ≤ N ≤ 10^9) 輸出:假設存在這種Q,則輸出Q,假設不存在,輸出-1
 */
public class NewIntProduct {

	public static int getNew(int input) {
		// 若該數是各位數,那麽最小的肯定是1X該數
		if (input >= 0 && input <= 9) {
			return 10 + input;
		}

		List<Integer> list = new ArrayList<Integer>();// 存放滿足要求的乘數

		list = getNew(input, list);// 遞歸獲取

		// 若list中含有-1,說明初始數input本身或者input的約數不滿足條件
		if (list.contains(-1)) {
			return -1;
		}

		// 將list排序
		Collections.sort(list);

		int len = list.size();

		int result = 0;// 終於的返回值

		// 依據list中的各位數拼成終於的返回值
		for (int i = len - 1; i >= 0; i--) {
			result += Math.pow(10, len - 1 - i) * list.get(i);
		}

		return result;
	}

	/**
	 * @param n
	 *            初始數
	 * @param list
	 *            滿足要求的乘數
	 * @return
	 */
	private static List<Integer> getNew(int n, List<Integer> list) {

		// 若初始數已經是一個個位數,則直接加入到list中,並跳出遞歸
		if (n >= 0 && n <= 9) {
			list.add(n);
			return list;
		}

		boolean flag = false;// 是否存在個位數的約數的標誌

		// 依次用9-2,作為除數,看初始數是否存在個位數的約數
		for (int i = 9; i >= 2; i--) {
			// 若存在
			if (n % i == 0) {
				flag = true;
				list.add(i);// 將該約束加入到list中
				getNew(n / i, list);// 遞歸查找商數的滿足條件的約束
				break;
			}
		}

		// 不存在,說明不滿足條件
		if (!flag) {
			list.add(-1);
		}

		return list;
	}

	public static void main(String[] args) {
		System.out.println(getNew(18));
	}
}


京東軟開2015筆試:尋找滿足條件的整數