习题:P1249"/>
洛谷习题:P1249
P1249 最大乘积
题目描述
一个正整数一般可以分为几个互不相同的自然数的和,如
3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4。
现在你的任务是将指定的正整数 n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
题解
这题涉及贪心算法和高精度,标签写的。
解题思路的话参考大佬们的博客吧。
This way!别人家的孩子的解题思路,卑微如我。
具体代码如下(我只配无脑敲代码)
#include<iostream>
#include<vector>
using namespace std;
int main() {int n;vector<int> num ; //存储拆分的数int ans[1000] = { 0 }; //乘积int sum = 0; //拆分数的和cin >> n;if (n < 5) //特判,如果n小于5,他本身就是最优解cout << n << endl << n;else {for (int i = 2; sum <= n; i++) {num.push_back(i);sum += i;}}int k = sum - n; //超出的数if (k == 1) {num.erase(num.begin());num[num.size() - 1] += 1;}else {for (vector<int>::iterator itr = num.begin(); itr < num.end(); itr++) {if (*itr == k) {num.erase(itr);break;}}}//高精度ans[0] = num[0];int len = 1;for (int i = 1; i < num.size(); i++) {int a = num[i];for (int j = 0; j < len; j++) {ans[j] *= a;}for (int j = 0; j < len; j++) { //进位if (ans[j] > 9) {ans[j + 1] += ans[j] / 10;ans[j] %= 10;if (j == len - 1)len++;}} }for (vector<int>::iterator itr = num.begin(); itr < num.end(); itr++)cout << *itr << " ";cout << endl;for (int i = len - 1; i >= 0; i--)cout << ans[i];return 0;
}
更多推荐
洛谷习题:P1249
发布评论