- 最后登录
- 2016-3-25
- 在线时间
- 130 小时
- 阅读权限
- 30
- 注册时间
- 2008-8-18
- 积分
- 909
- 帖子
- 775
- 精华
- 0
- UID
- 40315
- 性别
- 男
 
- 积分
- 909
- 帖子
- 775
- 精华
- 0
- UID
- 40315
- 性别
- 男
|
一个数学定理:
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;
dest[count - 2] = x;
dest[count - 1] = y;
return true;
}
int main(int argc, char* argv[])
{
double dest[4];
double sum = 7.11;
double prod = 7.11;
bool suc = my_func(sum,prod,4,dest);
if(suc){
cout<<"calc success:\n ";
for(int i = 0; i < 4; ++i){
cout<< dest<<"\n " ;
}
}else{
cout<<"unsulve! \n";
}
return 0;
}
测试已通过。
calc success:
1.7775
1.7775
2.731
0.824004 |
|