-2

我们可以通过减法来除数,然后在余数处停止,如下所示

但是我们如何继续通过减法来除余呢?我在谷歌上看了看,找不到这样的答案。它们不会超出其余部分。

例如,假设我们有

7/3.
7-3 = 4
4-3 = 1

所以,我们有2 & (1/3). 我们如何1/3 仅使用减法或加法进行除法?

重复 - 请注意,我不想使用乘法或除法运算符来执行此操作。

4

4 回答 4

6

您可以获得额外的“数字”,达到任意精度(在您想要的任何基数中,为简单起见,我将使用基数 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

依此类推,直到达到任意精度。

于 2013-08-05T16:07:22.573 回答
2

如果您想继续获得十进制数字,请将余数乘以 10 的幂。

例如,如果您想要 2.333,那么您可以将余数乘以 1000,然后重复该算法。

于 2013-08-05T16:06:16.423 回答
0

这是一个仅使用 + 和 - 的完整程序,翻译成您选择的语言:

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 将是周期部分。

于 2013-08-10T09:10:04.647 回答
0

这取决于你在问什么。

如果您要问如何获得最后的分数并且很简单,让我们举一个不同的例子。

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);

我希望这回答了你的问题!

于 2013-08-05T16:29:41.397 回答