满足条件的最小组合数m

题目:输入一个正整数n,请找出最小的正整数m(m>9,也就是至少是两位数),使得m的各个位(个位、十位、百位。。。)乘积之和等于n,不存在输出-1。
例如:n = 36时,输出49; n=100时,输出455;
分析:首先需要判断对于任意一个n,是否存在相应的m,判断依据是对于十进制而言,每一位在0-9之间,若该数存在10以上的质因子,则一定不存在相应的m。
逆向思维:不存在10以上的质因子,也就是所有的质因子都在10以内,10以内的质数包括2,、3、5、7四个数,问题转化为若该数仅存在这四个质因数,即存在
对应的m;
判断代码如下:

int judge(int n)
{ 
	if ( n <= 1 ) return -1;
	int a[4] = { 2, 3, 5, 7 }, temp = n;
	for ( int i=0; i<4; ++i )  //反复除这4个质因子,若能除尽,则存在m
	{
     		while ( temp%a[i] == 0 )
     			temp /= a[i];
    		if ( temp == 1 ) break;
	}
	if ( temp != 1 ) return -1;
	return 1;
}


判断完了以后,需要找出这个m,最简单的办法也就是最笨的办法,可以从1开始遍历每一个数,若满足各位乘积等于n则满足条件。
改善方法:问题可以转为使用x个2,y个3,z个5,t个7进行拼凑出最小的m
例如:n=100=2*2*5*5,拼凑出455,直观的想法就是尽可能的使得位数最少,并且把大数放在低位,要使得位数尽可能的少,则尽可能使得3个2结合形成8,两
个3结合形成9,要使得结合的数尽可能小,可以除8和9以外的2和3结合形成6,其次是4和3,则优先情况应该是8,9,6,3,2,将不可以组合的5,7包含在内就是
8,9,6,3,2,5,7,由于8和9互不影响,则按照大小可以排列为9,8,7,6,5,4,3,2
实际综合代码如下:
int judge_get( int x )
{
	if(judge(x) == -1)
		return -1;
	int b[8] = { 9, 8, 7, 6, 5, 4, 3, 2 };
	int sum = 0, base = 1;
	for ( int i=0; i<8; i++ )
	{
    		while ( x%b[i] == 0 )
    		{
        		x /= b[i];
        		sum += b[i]*base;//大数在低位
        		base *= 10;
    		}
    		if ( x == 1 ) break;
	}
	return sum;
}



最小组合数问题是一个经典的编程题目,主要涉及到数组和排序算法的应用。给定一个正整数数组,你需要找出所有可能由这些数字组成的不同整数,并返回其中的最小值。在C++中,你可以采用递归或者动态规划的方法来解决这个问题。 以下是使用递归的一个简单思路: 1. 定义一个递归函数,该函数接受一个数组和当前组合的起始和结束索引。 2. 遍历数组,对于每个起始位置,尝试添加当前位置的数字到当前组合,并递归调用函数处理下一个位置。 3. 在递归过程中,记录并更新最小组合数。 4. 当遍历完数组时,返回找到的最小组合数。 下面是基本的递归代码示例: ```cpp #include <iostream> #include <vector> #include <string> using namespace std; string combine(vector<int>& nums, int start, int end, string prefix = "") { if (start > end) { // 如果到达了数组末尾,返回当前组合 return prefix; } // 尝试将当前数字加到前缀 string result1 = combine(nums, start + 1, end, to_string(nums[start]) + prefix); // 不加当前数字,直接递归处理下一个 string result2 = combine(nums, start + 1, end, prefix); // 返回两者中的较小者 return min(result1, result2); } int smallestCombination(vector<int>& nums) { sort(nums.begin(), nums.end()); // 先对数组进行排序 return combine(nums, 0, nums.size() - 1); // 从头开始递归 } int main() { vector<int> nums = {1, 2, 3}; int result = smallestCombination(nums); cout << "The smallest combination is: " << result << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值