金山上机题中附加题的思考
题目是:
给定一个介于0与1之间的小数,以及分母的最大位数(1-6位)。请构造一个程序,寻找分母在指定位数之内,与给定小数最接近的分子——分母对(显然,分子、分母须为整数)。例如,黄金分割比0.618...,分母限定为2位时,最接近的分数为55/89;分母限定为3位时,为 610/987
我的解题思路请看下面c# 的代码(C++ 有些函数忘记了)
double shang = 0.618;
double sym = 1;
int fenMu = 0;
for (int i = 200; i < 1000; i++)
{
double temp = i * shang; //得到分子
int zhong = (int)(temp);
temp = temp - (double)zhong; //不管分子是小数还是整数减去比分子小的整数,得到小数
if (sym >= temp)// 获得最小的那个小数,记录这是的分母,分子用分母 * 商 求整即可
{
sym = temp;
fenMu = i;
}
}
这个只是一个测试,所以我直接取 0.618为值,优化改进的地方时可以根据给定的值算出计算时候最小开始的值比如这里的200
提出这个方案来大家讨论一下,抛砖引玉,寻找更好的算法