1263: [SCOI2006]整数划分
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1449 Solved: 736
[ Submit][ Status][ Discuss]
Description
从文件中读入一个正整数n(10≤n≤31000)。要求将n写成若干个正整数之和,并且使这些正整数的乘积最大。 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=108为最大。
Input
只有一个正整数: n (10≤n≤31000)
Output
第1行输出一个整数,为最大乘积的位数。 第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。 (提示:在给定的范围内,最大乘积的位数不超过5000位)。
Sample Input
13
Sample Output
3
108
一定是将那个数拆成尽可能多的3,用数组模拟下乘法就好了
证明:
4 = 2*2
5 < 2*3
6 < 2*2*2 < 3*3
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int len, y[5005] = {1};
void Radix(int n);
int main(void)
{
int x, i;
scanf("%d", &x);
while(x>=5 || x==3)
{
Radix(3);
x -= 3;
}
while(x>=2)
{
Radix(2);
x -= 2;
}
printf("%d\n%d", len+1, y[len]);
for(i=len-1;i>=max(0, len-99);i--)
printf("%d", y[i]);
printf("\n");
return 0;
}
void Radix(int n)
{
int up, i;
up = 0;
for(i=0;i<=len;i++)
{
y[i] = y[i]*n+up;
up = y[i]/10;
if(y[i]>=10)
y[i] %= 10;
}
if(up>0)
y[++len] = up;
}