洛谷习题:P1249

编程入门 行业动态 更新时间:2024-10-06 19:23:48

洛谷<a href=https://www.elefans.com/category/jswz/34/1769768.html style=习题: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

本文发布于:2024-02-28 02:48:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767741.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:习题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!