n=5时,有如下分解式:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
在这些分解式中,3*2=6最大,这就是所要求的结果。
若n = 12,最大为3*3*3*3 = 81。
解法:
这一题冒失需要穷尽所有的分解式,其实不然,通过分析数据可得出如下假设:
对任意一个正整数x>3,有i=x/3,j=x%3, 设S为分解式乘积最大的数
当 j=0 时 s=3的i次方
当 j=1 时 s=3的(i-1)次方*4
当 j=2 时 s=3的i次方*2
证明:
首先我们证明将x分为3和2的组合得到的s最大
1)首先证明当3<x<10时满足
x=4 2*2=4
x=5 3*2=6
x=6 3*3=9
x=7 3*2*2=12
x=8 3*3*2=18
x=9 3*3*3=27
x=10 3*3*2*2=36
2)
假设x>10,且x=a[0]+...a[k]时s最大,且a[i]不等于2和3
若a[i]>10,假设a[i]=10*l+m (m<10),明显可知 若将a[i]分解为 l个10相加再加上m 得到的乘积为(10的l次方*m)不小于 a[i]。所有a[]中不可能存在大于10的数
若0<a[i]<10 由(1)可知 将a[i]分解为 2,3的组合得到的s'>=s
由此可以证明 将整数x 分解为2,3的组合 得到的s最大
又因为
3+3=2+2=2
3*3=9 > 2*2*2=8
所有若出现3个2就应该转换为两个3
证明介绍
代码如下:
/*
由于本人写的大数乘法代码没在这台机器上,现在又懒得再写一遍,就不考虑s>0xffffffff的情况了
如果发现错误欢迎指正
*/
///
#include <stdio.h>
void main()
{
unsigned int i=0,j=0,k,num;
unsigned long count;
for(num=3;num<50;num++)
{
i=num/3;
j=num%3;
switch( j )
{
case 0:
{
count=1;
for(k=0;k<i;k++)
{
count*=3;
}
break;
}
case 1:
{
count=1;
for(k=0;k<i-1;k++)
{
count*=3;
}
count=count<<2;
break;
}
case 2:
{
count=1;
for(k=0;k<i;k++)
{
count*=3;
}
count=count<<1;
break;
}
}
printf("%d %u\n\n",num,count);
}
}
///