我们可以通过减法划分一个数字,并在余数处停止,如图here所示。
但是我们如何通过减法继续划分余数?我看了谷歌,找不到这样的答案。它们不会超越其余部分。
例如,假设我们有
7/3.
7-3 = 4
4-3 = 1
所以,我们有2 & (1/3)
。我们如何做1/3
仅使用减法或加法除法?
重播 - 请注意,我不想使用乘法或除法运算符来执行此操作。
答案 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将是周期性部分。