zoukankan      html  css  js  c++  java
  • 最大乘积

    【问题描述】
        一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
        现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
    【输入】
    只一个正整数n,(3≤n≤10000)。
    【输出】
    第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
    第二行是最大的乘积。
    【样例】
    输入:
    10
    输出:
    2 3 5
    30

    这道题可以用dp做,也可以找出规律,那么就是一个数如果尽量的拆分成从2+3+4+5......这样的格式,

    可以推出n可以从2加到几,这里我是解了一个二次方程,设从n=2加到k,那么(2+k)*(k-1)/2=n,那么把k解出来就行了,不知道如何解二次方程的自行百度。

    然后有可能从2加到k不是刚好等于n,那么剩下的,就及有先后面的加数的方法平均分配。

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 int n=0,tot=0,sum[10003];
     9 int ans[251],che[251];
    10 
    11 
    12 int main( ){
    13     scanf("%d",&n);
    14     double gs=(double)n*2+2;gs=(double)1+4*gs;gs=sqrt(gs);gs=(-1+gs)/2;
    15     int tot=(int)gs;
    16     int fen=n-((tot+2)*(tot-1)/2);
    17     int jia=fen/(tot-1),sy=fen-(tot-1)*jia;
    18     for(int x=2;x<=tot;x++)sum[x]=x+jia;
    19     for(int x=tot;x>tot-sy;x--)sum[x]++;
    20     ans[0]=1,ans[1]=1;
    21     for(int x=2;x<=tot;x++){
    22         cout<<sum[x]<<" ";
    23         memset(che,0,sizeof(che));
    24         for(int y=1;y<=ans[0];y++)che[y]=ans[y]*sum[x];
    25         int cnt=1;
    26         while(1){
    27             if(cnt>ans[0]&&che[cnt]==0)break;
    28             ans[cnt]=che[cnt]%10;
    29             che[cnt+1]+=che[cnt]/10;
    30             cnt++;
    31         }
    32         ans[0]=cnt-1;
    33     }cout<<endl;
    34     for(int x=ans[0];x>=1;x--)cout<<ans[x];
    35 
    36 }
  • 相关阅读:
    玩耍redis遇到的问题之记录
    哈勃望远镜--星柱图
    用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式
    div水平居中
    hibernate和spring下载网址
    intellj idea 如何设置类头注释和方法注释(转载)
    转载:IT人高效的休息方式
    什么是REST?以及RESTful的实现
    easyui datagrid 获取记录数 页数 当前页
    font字体文件跨域
  • 原文地址:https://www.cnblogs.com/Ateisti/p/5791082.html
Copyright © 2011-2022 走看看