最优分解问题

xiaoxiao2021-02-28  39

最优分解问题

设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。 输入 10 输出 30

#include <stdio.h> void main() { int n,i,j; int sum=1; int a[10]={0}; a[0]=2; printf("输入要分解的数:\n"); scanf("%d",&n); i=1; while(n>a[i-1]) //最初分配的因子 { if(i==0) n-=a[0]; a[i]=a[i-1]+1; n-=a[i-1]; i++; } while(n>0) //剩下的数依次减一,加在已分配好的因子上 { for(j=0;j<i;j++) { a[i-j-2]++; n--; if((i-j-2)==0) { j=0; break; } if(n==0) break; } } j=0; while(a[j+1]) //求最终的乘积 { sum*=a[j]; j++; } printf("乘积最大的数为:%d\n",sum); } /* 思路: 因为要使乘积最大,所以要尽量分解为相似大小的数。 分解时,因数从2开始,每次加1,n=n-a[i],保证剩下的数比下一次的数大。 否则从后往前循环已经出现的数a[i],一次加1,知道n=0为止。 例如: 分解13 分解为 2 3 4 ,还剩下 4 ,不够继续分解的下一个数"5",就把 4 依次分配给前面的因子, 分配顺序是 4 => 3 => 2 。所以最终结果为 3 4 6,这就是最大乘积的因子。 (分配顺序为从大到小,如果还剩下,就继续从大到小分配) */
转载请注明原文地址: https://www.6miu.com/read-806987.html

最新回复(0)