问题:给你一个数n把它分为若干个数(不同) 使得他们的乘积最大
分析 :
把一个数n可以分为a,b两个大于一的数,他们的乘积一定会大于这个数n
so 拆开数的原则就是把他们分的尽可能小的数 那么最好是x个2 因为不同所以最好两两相差不超过2
于是乎 可以使得 n = 2+3+...+t
e.g 6=2 * 3 *1 用1不能改变它的乘积值 所以把剩下的加到最前头(保证不同)6 = 2 * 4
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; int ans[1000]; int main() { int n; scanf("%d",&n); int i = 2; int sum = 0; while(sum+i<=n) { sum+=i; ans[i-2]=i; i++; } n-=sum; i=i-3; int mark = i; while(i>=0&&n>0) { n--; ans[i]++; i--; } if(n>0) ans[mark] ++; bool f = true; for(i=0;i<=mark;i++) { if(!f) printf(" "); f = false; printf("%d",ans[i]); } printf("\n"); }
时间: 2025-01-01 04:39:21