如何找到整数乘数以达到 10 的次方?

How to find an integer multiplier to get to a power of 10?

我正在尝试创建精确的十进制数字类型。我将其存储为有理数 p/q,其中 q 始终为 10 的幂。

现在,如果我尝试除这些数字之一,我需要查看结果是否可以表示为有限小数展开式。例如 10.2 / 80 => 0.1275 可以,但是 10 / 3 = 3.333... 不行。

它归结为查看一个整数 q 并询问:是否有一个整数 m 使得:

q * m = 10 ^ n    (q, m, n are all integers)

我可以写一个循环来搜索它,测试 n=0,1,2,3,...?但是有没有更直接的方法呢?我不知道如何代数求解那个小方程。

首先要看q是否可以写成2s和5s的乘积;如果可以,则 m 和 n 将有一个整数解。不然就没有了。

我们可以找到整数 a、b 和 c 使得 q = (2^a)(5^b)c 并且 c 不能被 2 或 5 整除。通过重复将 q 除以 2 来做到这一点,只要q 仍然可以被 2 整除,每次递增 a;然后,除以 5 并递增 b,只要 q 仍能被 5 整除;然后,c 将是 q 在重复除以 2 和 5 的过程后剩下的任何值。

此时,如果c = 1,我们可以找到解决方案;否则,没有有效的整数 m。假设 c = 1,检查 a 和 b:

  • 如果a = b,q已经是10的幂;选择 m = 1
  • 如果a < b,选择m = 2^(b-a)
  • 如果a > b,选择m = 5^(a-b)