我们可以通过减法来除数,然后在余数处停止,如下所示。
但是我们如何继续通过减法来除余呢?我在谷歌上看了看,找不到这样的答案。它们不会超出其余部分。
例如,假设我们有
7/3.
7-3 = 4
4-3 = 1
所以,我们有2 & (1/3)
. 我们如何1/3
仅使用减法或加法进行除法?
重复 - 请注意,我不想使用乘法或除法运算符来执行此操作。
您可以获得额外的“数字”,达到任意精度(在您想要的任何基数中,为简单起见,我将使用基数 10,但如果您尝试实现算法,您可能会选择基数 2)
1) Perform division as you've illustrated, giving you a quotient (Q=2), a divisor (D=3), and a remainder (R=1)
2) If R=0, you're done
3) Multiply R by your base (10, R now =10)
4) Perform division by subtraction again to find R/D (10/3 = 3+1/3).
5) Divide the resulting quotient by your base (3/10 = 0.3) and add this to what you got from step 1 (now your result is 2.3)
6) Repeat from step 2, dividing the new remainder (1) by 10 again
虽然这听起来很像我刚才多次提到的除法,但我们正在除以你的基地。为简单起见,我使用了 10,但您实际上会使用基数 2,因此第 3 步实际上是左移(每次 1 位),第 5 步实际上是右移(第一次通过 1 位,2 位第二,以此类推)。
7/3.
7-3 = 4
4-3 = 1
7/3 = 2 R 1
1*10 = 10
10-3 = 7
7-3 = 4
4-3 = 1
10/3 = 3 R 1
7/3 = 2 + 3/10 R 1
7/3 = 2.3 R 1
1*10 = 10
10-3 = 7
7-3 = 4
4-3 = 1
10/3 = 3 R 1
7/3 = 2.3 + 3/100 R 1
7/3 = 2.33 R 1
依此类推,直到达到任意精度。
如果您想继续获得十进制数字,请将余数乘以 10 的幂。
例如,如果您想要 2.333,那么您可以将余数乘以 1000,然后重复该算法。
这是一个仅使用 + 和 - 的完整程序,翻译成您选择的语言:
module Q where
infixl 14 `÷` `×`
a × 0 = 0
a × 1 = a
a × n = a + a×(n-1)
data Fraction = F Int [Int]
a ÷ 0 = error "division by zero"
a ÷ 1 = F a []
0 ÷ n = F 0 []
a ÷ n
| a >= n = case (a-n) ÷ n of
F r xs -> F (r+1) xs
| otherwise = F 0 (decimals a n)
where
decimals a n = case (a × 10) ÷ n of
F d rest = (d:rest)
instance Show Fraction where
show (F n []) = show n
show (F n xs) = show n ++ "." ++ concatMap show (take 10 xs)
main _ = println (100 ÷ 3)
如果有的话,很容易以检测分数的周期性部分的方式扩展它。为此,小数应该是元组,不仅保留小数位本身,还保留产生它的被除数。然后可以调整打印函数以打印无限分数,如 5.1(43),其中 43 将是周期部分。
这取决于你在问什么。
如果您要问如何获得最后的分数并且很简单,让我们举一个不同的例子。
26 / 6. 26 - 6 = 20 count 1 20 - 6 = 14 count 2 14 - 6 = 8 count 3 8 - 6 = 2 count 4
(在代码中,这将通过 for 循环来完成)
之后,我们将有 4 2/6。为了简化,切换除数和除数:
6 / 2。6 - 2 = 4 计数 1 4 - 2 = 2 计数 2 2 - 2 = 0 计数 3
如果这结束时没有余数,则显示为计数上的 1。
在伪代码中:
int a = 26;
int b = 6;
int tempb = 6;
int left = 26;
int count = 0;
int count2 = 0;
left = a - b;
for(count; left > b; count++){
left -= b;
}
if(left > 0){
for(count2; tempb > left; count2++){
tempb -= left;
}
console.log("The answer is " + count + " and 1/" + count2);
我希望这回答了你的问题!