VJ 1033 整数分解(版本2)

描述

整数分解(版本2)
一个正整数可以分解成若干个自然数之和。请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大。

例如n=10,则可以分解为2+2+3+3,乘积m=2*2*3*3=36

格式

输入格式

一个正整数n

输出格式

输出分解的自然数的最大乘积m

样例1

样例输入1[复制]

10

样例输出1[复制]

36

提示

简单题,所有数据随机生成

 

题解 : n <= 3 时, 答案最大为n,即不拆。

         n > 3 时, 我们发现应该把数拆成尽量多的2和3的和,因为大于2,3的数拆成2,3乘积都别拆成别的大,就算是4也只是与2 * 2等价(4 = 2 + 2), 不会使答案更优。

CODE:

#include <iostream>
#include <cstdio>
#include <cstring>
#define REP(i, s, n) for(int i = s; i <= n; i ++)
#define REP_(i, s, n) for(int i = n; i >= s; i --)
#define MAX_N 1000 + 10

using namespace std;

int a[MAX_N],la=1;

void mul (int e){
    int s = 0, t = 0;
    REP(i, 0, la - 1){
        t = a[i] * e; a[i] = (t + s) % 10;
        s = (t + s) / 10;
    }
    while(s > 0){
        a[la ++] = s % 10;
        s /= 10;
    }
}

int main (){
    int n;
    scanf("%d",&n);
    memset (a, 0, sizeof (a));
    a[0] = 1;
    if(n%3==0){ REP(i, 1, n / 3) mul(3); }
    else if(n % 3 == 1){ 
        REP(i, 1, (n / 3 - 1)) mul(3);    
        mul(4);
    }
    else{
        REP(i, 1, n / 3) mul(3);
        mul(2);
    }
    if (n > 2)
        REP_(i, 0, la - 1) printf("%d",a[i]);
    else printf("%d",n);
    return 0;
}

 

posted @ 2015-05-25 09:08  ALXPCUN  阅读(369)  评论(0编辑  收藏  举报