积最大的整数分解

    xiaoxiao2021-03-26  91

    第18届国际数学奥林匹克竞赛第4题为:

    求和为1976的正整数之积的最大值?

    这一整数分解题要求分解整数的个数不限,各分解整数的大小也不限,正确结果是把1976分解为658个3与1个2,积P=2*3^658最大;

    如果保留分解个数不限,但要求各分解的整数互不相同,也是一个很有意思的整数分解案例,例如如何把2017分解为若干个互不相同的正整数之和,使这些互不相同的正整数之积最大;

    进行一般化处理,使把指定正整数n分解为若干个互不相同的正整数之和,使这些正整数之积最大;

    1.说明:

    这一分解题看起来简单,实施起来并不简单,为了叙述方便,把分解的整数称为零数,题目相求零数互不相同,而零数的个数不限,目标是使零数之积达最大;

    设分解中的最小零数为c,最大零数为d,要使积最大必须满足:

    (1)、c>1,若c=1,去掉零数1,把1加至最大零数,显然积会增大;

    (2)、零数按由小到大排列,从c到d的零数序列中,中间的空数(不在零数序列中的数)不能多于一个;

    设序列中有两个空数x、y,满足a(i)< x< y< a(j),其中a(i)、a(j)为零数序列中的项(i< j),x=a(i)+1,y=a(j)-1,因为a(i)+a(j)=x+y,而a(j)>a(i)+1>=x*y=(a(i)+1)*(a(j)-1)>a(i)*a(j),即把a(i)、a(j)两个零数分别换成x、y后和不变而积增加,与所设积最大矛盾;

    (3)、c<4,即c只能取2、3;

    若c=4,此时若5在序列中,把5化为2+3,积增加;若5不在序列中而6在序列中,把4、6化为2、3、5,显然和不变而积增加;若5、6都不在序列中,与上述(2)矛盾;

    若c>4,把c化为2与c-2,显然2< c-2,且2+(c-2)=c,但2(c-2)> c,积增加;

    因此,把指定的n转化为以2或3开始的连续或至多一个空数的正整数序列,相应的积达最大;

    据此,设置循环求和s=2+3+……+a,至s-n>0,分以下情形:

    若s-n=a,则去掉数a,得c=2连续至d=a-1序列;

    若s-n=2,则去掉数2,得c=3连续至d=a序列;

    若s-n=1,则去掉数2与a,得c=3至d=a+1,序列中间空数a;

    若2< s-n< a,则去掉数s-n,得c=2至d=a,序列中间空数s-n;

    打印输出以上所得使积最大且互不相同的正整数序列,并求出最大值;

    2.程序设计:

    #include<stdio.h> #include<math.h> int main() { int a,c,d,h,k,n,s; double t; printf("把n分解为若干个互不相同的正整数之和,使其积最大。\n"); printf("请输入正整数n(n>3):"); scanf("%d",&n); s=0; h=1; a=1; while(s<=n) { a++; s+=a; /*求和s=2+3+...+a至s>n为止*/ } if(s-n==a) { c=2; /*n分解为2至a-1的连续序列*/ d=a-1; } else if(s-n==2) { c=3; /*n分解为3至a的连续序列*/ d=a; } else if(s-n==1) { c=3; /*n分解为3至a+1(不含a)*/ d=a+1; h=a; } else { c=2; /*n分解为2至a(不含s-n)*/ d=a; h=s-n; } printf("%d分解为:%d--%d",n,c,d); if(h>0) printf("(不包括其中的数%d)\n",h); printf("其积最大为:"); t=1; for(k=c;k<=d;k++) /*从c到d求积*/ t=t*k; t=t/h; /*从积中除去空数h*/ printf("%.3e\n",t); }

    3.程序运行示例:

    把n分解为若干个互不相同的正整数之和,使其积最大。 请输入正整数n(n>3):2017 2017分解为:2--64(不包括其中的数62) 其积最大为:2.047e+087
    转载请注明原文地址: https://ju.6miu.com/read-350100.html

    最新回复(0)