一个数学定理:
N个正数之和固定,设为SUM,则这N个正数的积的值域为: (0,(SUM/N)^N ].当且仅当这N个数相等时取得最大值。
利用这个定理就很容易解决了(你要了解它的精髓)。
另外一点要知道的:
方程组: x + y == a ; x * y = b ;
的解是: x = (a + sqrt ( a * a - 4 * b ) ) /2;
y = (a - sqcrt ( a * a - 4 * b ) ) /2;
将问题扩展:有N个正数和为SUM,积为PROD,求这N个正数的一组解。
函数定义:bool my_func(const double sum,
const double prod,
const unsigned int count ,
double* dest ) ;
返回true代表求得一组解,返回false则代表问题无解。
函数的实现如下:
一个数学定理:
N个正数之和固定,设为SUM,则这N个正数的积的值域为: (0,(SUM/N)^N ].当且仅当这N个数相等时取得最大值。
利用这个定理就很容易解决了(你要了解它的精髓)。
另外一点要知道的:
方程组: x + y == a ; x * y = b ;
的解是: x = (a + sqrt ( a * a - 4 * b ) ) /2;
y = (a - sqcrt ( a * a - 4 * b ) ) /2;
将问题扩展:有N个正数和为SUM,积为PROD,求这N个正数的一组解。
函数定义:bool my_func(const double sum,
const double prod,
const unsigned int count ,
double* dest ) ;
返回true代表求得一组解,返回false则代表问题无解。
函数的实现如下:
#include <stdio.h>
#include <math.h>
#include <iostream.h>
bool my_func(const double sum,
const double prod,
const unsigned int count ,
double* dest )
{
if( count < 2 ) return false;
double average = sum / count ;
if( prod > pow(average,count) ) return false;
for(int i = 0; i < count -2; ++i ) dest = average;
double x , y , a , b ; //利用上面方程组的解
a = average * 2;
b = prod / pow(average,count - 2 );
x = (a + sqrt ( a * a - 4 * b ) ) /2;
y = (a - sqrt ( a * a - 4 * b ) ) /2;