给定一个正整数n,则在n所有的分解式中,求因子乘积最大的一个分解及此乘积。

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);
    }

}

///

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值