一个数由三个数相乘得到一共有几种组合的算法

进阶其实就是在找这个数的公因数有多少个取,从中取三个数进行排列组合

public class Main {
    public static void main(String args[]) {

        //常规思路:让你写一个寻找因数的代码,如果数据小还好说但是数据如果特别大
        //三个for循环计算机也算不过来


        long num = 2021041820210418l;


        for (long i = 1; i < num; i++) {
            for (long j = 1; j < num; j++) {
                for (long k = 1; k < num; k++) {
                    if (i * j * k == num) {
                        System.out.println(i);
                        System.out.println(j);
                        System.out.println(k);
                    }
                }
            }
        }
    }
}

进阶方法,将三个循环减少一个循环

public class Main{
       public static void main (String []args){
              int count = 0;
              for (int i = 1; i < 10; i++){
                     for (int j = 1; j < 10;j++){
                          if(!isInt(i*j)){
                               count++;
                           }
                     }
              }
              System.out.print(count);
                
       }
      public static boolean isInt (int num){
             int  n = 10;
             if (n % num == 0){
                 return false;
             }
         return true;
       
      }
}//但是这种方法还是计算量太大了

下面提供一个跳跃思维希望可以给大家一些启发

package com.lh.create;

import java.util.ArrayList;

public class Main{
    public static void main(String[] args) {
        long  num = 2021041820210418l;              //初始一个大数据
        ArrayList<Long>arr = new ArrayList<Long>();//定义一个long型的集合
        //!!!这里只需要把数据便利到num的开平方数即可,至于为什么看for循环里面的语句就可以理解了
        for (long i = 1; i <=Math.sqrt(num) ; i++) {
           //初始量除以i能够整除就是num的因数
            if (num % i == 0){
                arr.add(i);
                //!!!注意这里定义一个新的变量n就是将num除以因数i就可以得到另一个较大的因数
                //这也是为什么只需要遍历到num的开平方数即可
                long n = num / i;
                if (n != i){
                    arr.add(n);
                    //只需要将i和n输出就可以得到所有num的因数了
                    System.out.println(i);
                    System.out.println(n);
                }

            }

        }
        System.out.println(arr.size());//这个就是统计num里面总共有多少个因数



    }

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题可以使用动态规划来解决。 设 $f_i$ 表示将 $i$ 分解为若干正整之和,使得这些正整的乘积最大,所得到的最大乘积。 显然,当 $i=2$ 时,只能将 $2$ 分解为 $1+1$,乘积为 $1$。 当 $i \geq 3$ 时,可以将 $i$ 分解成两个正整 $j$ 和 $i-j$ 的和,或者将 $i$ 分解成三个及以上正整之和。 对于第一种情况,分解出来的两个正整的乘积为 $j \times (i-j)$,因此 $f_i$ 可以通过更新 $f_j \times f_{i-j}$ 来计算。 对于第二种情况,假设将 $i$ 分解成 $a_1 + a_2 + \cdots + a_k$,其中 $k \geq 3$,则 $f_i$ 可以通过更新 $f_{a_1} \times f_{a_2} \times \cdots \times f_{a_k}$ 来计算。 综上所述,我们可以得到以下状态转移方程: $$ f_i = \max\{j \times (i-j), f_{a_1} \times f_{a_2} \times \cdots \times f_{a_k}\} $$ 其中 $j$ 取遍 $1,2,\cdots,i-1$,$a_1,a_2,\cdots,a_k$ 的取值满足 $a_1+a_2+\cdots+a_k=i$。 下面是 Python 代码实现: ```python def max_product(n: int) -> int: if n <= 2: return 1 f = [0] * (n + 1) f[1] = 1 f[2] = 1 for i in range(3, n+1): for j in range(1, i): f[i] = max(f[i], j * (i-j), f[j] * f[i-j]) return f[n] ``` 例如,对于输入 $n=10$,输出为 $36$,即 $10=3+3+4$ 时,这些的乘积最大,为 $3 \times 3 \times 4=36$。 ### 回答2: 要取使这些相乘最大的结果,可以通过贪心算法来实现。首先,我们观察到,当n为2或3时,无论怎样分割,其乘积都小于等于n本身。因此,对于n大于3的情况,我们可以将其分为尽可能多的3和尽量少的2。 假设n可以表示为3的个x和2的个y的和,即n = 3x + 2y。那么我们可以得到以下几个结论: 1. 当y为0时,即n为3的倍时,最大乘积为3的x次方。 2. 当y为1时,我们可以将一个2和一个3组合为1个6,此时最大乘积为2 * 3^(x-1)。 3. 当y为2时,最大乘积为2^2 * 3^x。 4. 当y为3时,我们可以将三个2组合一个8和一个1,此时最大乘积为2^3 * 3^(x-1)。 通过观察以上情况,我们可以发现,当y大于等于4时,我们可以将4个2组合一个8和一个1,此时的乘积一定大于y为3时的情况。因此,我们可以得出一个规律,即当n大于3时,最大乘积结果为2的y次方 * 3的x次方。 综上所述,对于一个大于1的整n,我们可以先将其分解成尽可能多的3和尽量少的2,再将分解后的3的个x和2的个y代入公式 2^y * 3^x ,即为所求的最大乘积结果。 ### 回答3: 给定一个大于1的整n,我们需要将n分解成若干个正整之和,并找到这些相乘的最大结果。 假设我们将n分解成k个正整之和,可以设这k个正整为x1, x2, ..., xk。那么我们的目标是找到这些的乘积最大值。 首先,我们可以发现当这k个尽量均匀分布时,它们的乘积最大。也就是说,我们需要将n平均分成k个,即x1 = x2 = ... = xk = n/k。 但是由于n和k可能无法整除,所以我们需要取整部分,即令x1 = x2 = ... = x_{k-1} = n/k,而最后一个xk = n - (k-1)(n/k)。 接下来,我们考虑如何选择k的值,使得乘积最大。我们可以发现,当k接近于n的平方根时,乘积最大。 为什么呢?假设k=n的平方根+1,即k = sqrt(n)+1。那么n/k = sqrt(n),而(n - (k-1)(n/k)) = 2*sqrt(n)。这样,我们得到的k个之积为sqrt(n)^(k-1) * 2*sqrt(n) = 2n^(k/2)。 可以看到,如果k稍微大于sqrt(n),我们得到的乘积会更大。 因此,我们可以选择k = int(sqrt(n)) + 1,即将n分成int(sqrt(n))+1个之和,其中int(x)表示取x的整部分。 综上所述,我们可以将输入的大于1的整n分解成int(sqrt(n))+1个正整之和,使得这些的乘积最大。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值