我需要能够准确输入两个部分已知的因子,每个因子精确地在小数点后15位,产品答案精确地在29个小数点后。在程序运行期间,这两个因素的开头数字(0.199848 ...和4.97438 ...)必须保持不变。每个因素中的零都是Python必须使用的并且“数值变化”。当乘以因子时,此“数值变化”必须将乘积0.99412293432154732337566954206转换为29位小数,并且不少于29位以匹配我的产品输入。我想知道Python完成运行后最终的因素以及与之匹配的产品。
示例:
我的输入因子1 0.199848000000000因子2 4.974380000000000产品0.99412293432154732337566954206
输出:输出希望是什么0.199848442087413 X 4.974384208042620 =0.99412293432154732337566954206
因此,总之,Python会找出与我给它的已知产品0.99412293432154732732566954206的输入相匹配的因素。我认为Python可能会在零上使用组合/排列,直到找到产生我输入的乘积的组合为止。
一些指针;
decimal
模块是一个不错的起点。例如:
In [1]: import decimal as dm
In [2]: dm.getcontext().prec = 29
In [3]: factor1 = dm.Decimal('0.199848')
Out[3]: Decimal('0.199848')
In [4]: factor2 = dm.Decimal('4.97438')
Out[4]: Decimal('4.97438')
In [5]: desired = dm.Decimal('0.99412293432154732337566954206')
Out[5]: Decimal('0.99412293432154732337566954206')
In [6]: factor1*factor2 > desired
Out[6]: False
请记住,产品可以是;
在第一种情况下,其中一个因素必须变得更大。在最后一种情况下,其中一个因素必须变小。
由于第二个因素最大,所以我将从factor1
开始。在小数点后加上9(可能的最大增量),并检查乘积是否大于目标值。
In [7]: new1 = dm.Decimal('0.1998489')
Out[7]: Decimal('0.1998489')
In [8]: new1*factor2 > desired
Out[8]: True
所以这个数字太大。小于9/2的最大整数是4,因此请尝试这样做。
In [9]: new1 = dm.Decimal('0.1998484')
Out[9]: Decimal('0.1998484')
In [10]: new1*factor2 > desired
Out[10]: False
现在将0.1998489和0.1998484之间的距离减半。并再次检查。你会发现0.1998487太大,但0.1998486太大。
现在转到factor1
的下一位,依此类推,直到找到factor1
的正确位数。
然后对factor2
进行相同操作,但现在也测试是否相等。