/*
整数分解(版本2)
一个正整数可以分解成若干个自然数之和。请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大。
例如n=10,则可以分解为2+2+3+3,乘积m=2*2*3*3=36
输入格式 Input Format
一个正整数n
输出格式 Output Format
输出分解的自然数的最大乘积m
*/
#include < stdio.h >
#define MAX 10001
/* int big_pow_x_y(int x,int y,int big[])
{
int len = 0 ,i,j ;
int xz[MAX]={0},yz[MAX] = {0} ;
return len ;
}
*/
int jinwei( int big[], int len)
{
int k ;
for (k = 1 ;k <= len ; k ++ )
if ( big[k] >= 10 )
{
if ( big[len] >= 10 )
len ++ ;
big[k + 1 ] += big[k] / 10 ;
big[k] %= 10 ;
}
return len ;
}
int pow_3 ( int x, int y , int big[])
{
int i,j,k,len = 1 ;
big[ 1 ] = 1 ;
for (i = 1 ; i <= y ; i ++ )
{
for (j = 1 ;j <= len ; j ++ )
big[j] *= x ;
len = jinwei(big,len);
}
return len ;
}
int main( void )
{
int k,n,h,last = 0 ;
int big[MAX] = { 0 },lbig = 0 ;
big[ 1 ] = 1 ;
scanf( " %d " , & n);
if ( n <= 4 )
{
printf( " %d " ,n);
return 0 ;
}
if ( n % 3 == 1 )
{
k = n / 3 - 1 ;
last = 4 ;
}
else
if ( n % 3 == 2 )
{
k = n / 3 ;
last = 2 ;
}
else
{
k = n / 3 ;
}
/* lbig = big_pow_x_y(3,k,big) ; */
if ( k > 0 )
lbig = pow_3( 3 ,k,big) ;
if ( last > 1 )
{
for (h = 1 ; h <= lbig ; h ++ )
big[h] *= last ;
lbig = jinwei(big,lbig);
}
for (h = lbig ; h >= 1 ; h -- )
printf( " %d " ,big[h]);
printf( " " );
return 0 ;
}
整数分解(版本2)
一个正整数可以分解成若干个自然数之和。请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大。
例如n=10,则可以分解为2+2+3+3,乘积m=2*2*3*3=36
输入格式 Input Format
一个正整数n
输出格式 Output Format
输出分解的自然数的最大乘积m
*/
#include < stdio.h >
#define MAX 10001
/* int big_pow_x_y(int x,int y,int big[])
{
int len = 0 ,i,j ;
int xz[MAX]={0},yz[MAX] = {0} ;
return len ;
}
*/
int jinwei( int big[], int len)
{
int k ;
for (k = 1 ;k <= len ; k ++ )
if ( big[k] >= 10 )
{
if ( big[len] >= 10 )
len ++ ;
big[k + 1 ] += big[k] / 10 ;
big[k] %= 10 ;
}
return len ;
}
int pow_3 ( int x, int y , int big[])
{
int i,j,k,len = 1 ;
big[ 1 ] = 1 ;
for (i = 1 ; i <= y ; i ++ )
{
for (j = 1 ;j <= len ; j ++ )
big[j] *= x ;
len = jinwei(big,len);
}
return len ;
}
int main( void )
{
int k,n,h,last = 0 ;
int big[MAX] = { 0 },lbig = 0 ;
big[ 1 ] = 1 ;
scanf( " %d " , & n);
if ( n <= 4 )
{
printf( " %d " ,n);
return 0 ;
}
if ( n % 3 == 1 )
{
k = n / 3 - 1 ;
last = 4 ;
}
else
if ( n % 3 == 2 )
{
k = n / 3 ;
last = 2 ;
}
else
{
k = n / 3 ;
}
/* lbig = big_pow_x_y(3,k,big) ; */
if ( k > 0 )
lbig = pow_3( 3 ,k,big) ;
if ( last > 1 )
{
for (h = 1 ; h <= lbig ; h ++ )
big[h] *= last ;
lbig = jinwei(big,lbig);
}
for (h = lbig ; h >= 1 ; h -- )
printf( " %d " ,big[h]);
printf( " " );
return 0 ;
}