整数最优分解问题

整数最优分解问题

 

Time Limit:   5000MS       Memory Limit:   65535KB
Submissions:   100       Accepted:   26

 

Description
设n是一个正整数。现要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。对于给定的正整数n,编程计算最优分解方案。

 

Input
第1行是正整数n。(n<10000)

 

Output
将计算出的最大乘积输出

 

Sample Input

 

10

 

Sample Output

 

36

 

解析:

这道题其实举几个例子就会很清晰了

最优分解乘积:1~4的是自身;5->3*2=6;6->3*3=9;7->3*4=12;8->3*3*2=18;9->3*3*3=27;10->3*3*4=36

很明显的规律出来了2,3,4一循环就有3的递增,因此就有个方法:用给出的数对3取余,有余数确定是2,3,4中的哪个,然后就边减3边乘3,这样结果就出来了;我这里只是做了个简化,两个3一起乘(即乘9);有人就会问为啥不3个3一起乘呢?原因在这里给出数的上限大约在10000,那么最后得到的数有多大,可想而知,因此要用字符数组存储,就会涉及到每位的乘法,如果是3个3,就会是27乘其他数,就没一位数乘一位数那么简便,就麻烦很多了

 

# include<stdio.h>
char res[10005]; 
int len; 
void mul(int num) 
{ 
    int sign=0,dg,i;
    for(i=0;i<len;i++) 
    { 
        dg=res[i]-'0';
        dg=dg*num+sign; 
        sign=dg/10; //进位标记
        dg%=10;    //本位需要保存的数值
        res[i]=dg+'0';
    }
    if (sign!= 0) //用这个假设是以防首位出现零的情况
    { 
        res[i]=sign+'0';
        len++;
    } 
} 
void f(int n) 
{ 
    int n3,n2,i; 
    if (n%2==0) 
        n3=n/6*2; //记录3的个数
    else                
        n3=(n-3)/6*2+1;//如果是奇数,肯定就会有个单出来的3 
    n2=n-3*n3;  //n2只会是0,2或4
    for(i=0;i<n3/2;i++)  //n3/2相当于6的个数,那么就会出现多少个乘积9 
        mul(9);
    if(n3%2) // 奇数要算上单出的3
        mul(3);
    if(n2)
        mul(n2); 
} 
int main() 
{ 
    int n,i; 
    scanf("%d",&n);
    if(n<=4) 
        printf("%d\n",n);
    else
    {
        res[0] ='1'; 
        len=1; 
        f(n);
        for (i=len-1;i>=0;i--) 
            printf("%c",res[i]);
        printf("\n");
    }
    return 0; 
}

 

 

 

posted on 2013-03-12 22:02  即为将军  阅读(2235)  评论(0)    收藏  举报

导航