码迷,mamicode.com
首页 > 其他好文 > 详细

VJ 1033 整数分解(版本2)

时间:2015-05-25 09:53:09      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

描述

整数分解(版本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;
}

 

VJ 1033 整数分解(版本2)

标签:

原文地址:http://www.cnblogs.com/ALXPCUN/p/4527068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!