将一个正整数分解成任意几个数的乘积

本文探讨如何利用动态规划解决将正整数分解为任意数的乘积的问题,并着重讲解如何找到一个特定条件的组合——使得分解后的乘积为一个奇数与一个偶数的乘积,且偶数部分是最小的。如果没有符合条件的组合,则输出'NO'。
摘要由CSDN通过智能技术生成

这其实也是个搜索组合问题,但是却可以借助动态规划的思想,将问题一步一步分解

首先来个简单点的,输出全部的可能!

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
 
//存储用户输入的整数
int n;
//存储用户输入的要拆分的个数
int m;
//计数器,记录拆分结果的个数
int totalKind;
//存储拆分出的因数
//注意:这里只定义了100长度的数组空间,可根据需要自己扩充
int a[100];

void print()
{
       cout<<n<<" = "<<a[1];
       for (int i=2; i<=m; i++) 
       {
             cout<<" * "<<a[i];
       }
      //输出换行
      cout<<endl;
     //拆分结果个数自增
      totalKind++;
}
 
 
void Split(int arrayIndex,int preDivisor,int newDivisor)
{
        //判断是否拆分结束,如果结束则输出该种拆分结果
        //拆分结束的条件是:
        //数组下标(即拆分的因数的个数)等于用户输入的拆分个数
       //并且当前因数大于前一个因数(即保证因数从小到大获取,避免重复)
       if (arrayIndex==m && newDivisor>=preDivisor) 
      {
             //存储当前(新)的因数
            a[arrayIndex] = newDivisor;
            //输出当前拆分结果
            print(); //不是一直存储,是只要满足条件就打印
            //退出该函数
            return;
     }
 
     //如果拆分没有结束,则将当前(新)的因数继续拆分
     for (int i=preDivisor; i<=newDiviso
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值