P1249 最大乘积
题目描述
一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+23=1+23=1+2,4=1+34=1+34=1+3,5=1+4=2+35=1+4=2+35=1+4=2+3,6=1+5=2+46=1+5=2+46=1+5=2+4。
现在你的任务是将指定的正整数 nnn 分解成若干个互不相同的自然数(也可以不分解,就是这个数字本身)的和,且使这些自然数的乘积最大。
输入格式
只有一个正整数 nnn,(3≤n≤100003 \leq n \leq 100003≤n≤10000)。
输出格式
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
输入输出样例 #1
输入 #1
10
输出 #1
2 3 5
30
solution
和一定,求积的最大值,则需要尽量让乘数(>=2)更多,所以将n分解成2开头的连续正整数的和,如果有多余的部分 k, 将最后的k个数各加1
代码
#include <sstream>
#include "iostream"
#include "math.h"using namespace std;
int a[500] = {1};void f(int n) {int s = 0;for (int i = 0; i < 499; i++) {a[i] *= n;a[i] += s;s = a[i] / 10;a[i] %= 10;}
}int main() {int n, k;cin >> n;k = (sqrt(8 * n + 9) - 1) / 2;int nn = (k + 2) * (k - 1) / 2;k++;for (int i = 2; i <= k; i++) {if (i != k - n + nn)cout << i << ' ', f(i);}cout << endl;int j = 499;while (a[j] == 0) j--;for (int i = j; i >= 0; i--) {cout << a[i];}return 0;
}