标签:
整数分解(版本2)
一个正整数可以分解成若干个自然数之和。请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大。
例如n=10,则可以分解为2+2+3+3,乘积m=2*2*3*3=36
一个正整数n
输出分解的自然数的最大乘积m
简单题,所有数据随机生成
题解 : n <= 3 时, 答案最大为n,即不拆。
n > 3 时, 我们发现应该把数拆成尽量多的2和3的和,因为大于2,3的数拆成2,3乘积都别拆成别的大,就算是4也只是与2 * 2等价(4 = 2 + 2), 不会使答案更优。
CODE:
#include <iostream> #include <cstdio> #include <cstring> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 1000 + 10 using namespace std; int a[MAX_N],la=1; void mul (int e){ int s = 0, t = 0; REP(i, 0, la - 1){ t = a[i] * e; a[i] = (t + s) % 10; s = (t + s) / 10; } while(s > 0){ a[la ++] = s % 10; s /= 10; } } int main (){ int n; scanf("%d",&n); memset (a, 0, sizeof (a)); a[0] = 1; if(n%3==0){ REP(i, 1, n / 3) mul(3); } else if(n % 3 == 1){ REP(i, 1, (n / 3 - 1)) mul(3); mul(4); } else{ REP(i, 1, n / 3) mul(3); mul(2); } if (n > 2) REP_(i, 0, la - 1) printf("%d",a[i]); else printf("%d",n); return 0; }
标签:
原文地址:http://www.cnblogs.com/ALXPCUN/p/4527068.html