通过减法除法 - 用减法除以余数?

时间:2013-08-05 16:00:40

标签: java c++ c math

我们可以通过减法划分一个数字,并在余数处停止,如图here所示。

但是我们如何通过减法继续划分余数?我看了谷歌,找不到这样的答案。它们不会超越其余部分。

例如,假设我们有

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

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

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

4 个答案:

答案 0 :(得分:6)

你可以获得额外的“数字”,最高可达任意精度(在你想要的任何基础上,我会使用基数10来简化,但如果你试图实现一个算法,你可能会选择基数2)< / p>

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,但你真的使用了base 2,所以第3步实际上是左移(每次1位),第5步实际上是右移(第1次通过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

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

答案 1 :(得分:2)

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

E.g。如果你想要2.333,那么你可以将余数乘以1000,然后重复算法。

答案 2 :(得分:0)

这取决于你的要求。

如果你问的是如何得到最终分数而且只是它,我们采取不同的例子。

26 / 6.
26 - 6 = 20  count 1
20 - 6 = 14  count 2
14 - 6 = 8   count 3
8 - 6 = 2    count 4

(在代码中,这将通过for循环完成)

之后,我们将有2 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);

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

答案 3 :(得分: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将是周期性部分。