zoukankan      html  css  js  c++  java
  • 整数最优分解问题

    Description设n是一个正整数。现要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。 对于给定的正整数n,编程计算最优分解方案。
    Input第1行是正整数n。(n<10000)
    Output将计算出的最大乘积输出

    Sample Input

    10

    Sample Output

    36




    #include<stdio.h>
    long b[160]={0};
    long calculate(int m,int n)
    {
    long k;
    long i,j,d=0,p=0,t;
    b[0]=3;
    for(i=1;i<m+n;i++)
    {
    if(i<m)t=3;
    else t=2;
    for(j=0;j<160;j++)
    {
    k=b[j]*t+d;
    b[j]=k%10000000000;
    d=k/10000000000;
    }
    if(d)b[j]=d;
    }
    for(i=159;i>=0;i--)
    if(b[i]){p=i;break;}
    return p;
    }
    void main()
    {
    long k1,k2;
    long i,p,n;
    scanf("%ld",&n);
    if(n<4)printf("%ld",n-1);
    else if(n==4)printf("4");
    else
    {
    if(n%2==0)k1=n/6*2,k2=n%6/2;
    else k1=(n-3)/6*2+1,k2=(n-3)%6/2;
    p=calculate(k1,k2);
    printf("%ld",b[p]);
    for(i=p-1;i>=0;i--)
    {
    if(b[i]>999999999){printf("%ld",b[i]);continue;}
    if(b[i]>99999999){printf("0%ld",b[i]);continue;}
    if(b[i]>9999999){printf("00%ld",b[i]);continue;}
    if(b[i]>999999){printf("000%ld",b[i]);continue;}
    if(b[i]>99999){printf("0000%ld",b[i]);continue;}
    if(b[i]>9999){printf("00000%ld",b[i]);continue;}
    if(b[i]>999){printf("000000%ld",b[i]);continue;}
    if(b[i]>99){printf("0000000%ld",b[i]);continue;}
    if(b[i]>9){printf("00000000%ld",b[i]);continue;}
    printf("000000000%ld",b[i]);
    }
    }
    printf(" ");
    }

  • 相关阅读:
    签字文件的保存逻辑
    POJ-1273 Drainage Ditches
    POJ-2513 Colored Sticks
    HDU-1251 统计难题
    POJ-1300 Door Man
    POJ-3159 Candies
    POJ-3169 Layout
    POJ-2983 Is the Information Reliable?
    POJ-1716 Integer Intervals
    HDU-3666 THE MATRIX PROBLEM
  • 原文地址:https://www.cnblogs.com/zhang20115330/p/3151628.html
Copyright © 2011-2022 走看看