2013-09-27 53 views
0

Scala中,我將有一個布爾表達式,當且僅當y = (x^2 - 1)/d^2是一個正方形,其應該是真實的。一點數學的東西:給定整數<code>d</code> & <code>x</code>廣場和圓角

我嘗試這樣做:

(Math.sqrt((x * x - 1)/(d * d)).toInt * Math.sqrt((x * x - 1)/(d * d)).toInt == ((x * x - 1)/(d * d))) 

但3元組(x = 2, d = <all values tested>, y = 0.0)似乎總是我的問題,這顯然是錯誤的答案。 我認爲我的錯誤來自四捨五入:如果x = 2,d = 4(例如)然後x * x - 1 == 3d * d == 16,所以分區導致0

你知道什麼是好表達?

+1

不確定您想要什麼。給出一個例子,你應該返回true,一個返回false。 –

+0

hi; y = 16 => true,y = 64 => true,但y = 63 => false – lolveley

+0

什麼是'x',什麼是'd',以及如何到達'y = 16 => true'等。? – Teepeemm

回答

1

如果n是圓形正方形,則Math.sqrt(n).toInt == Math.sqrt(n)。你的情況:

(Math.sqrt((x * x - 1)/(d * d)).toInt == Math.sqrt((x * x - 1)/(d * d))) 

但在這之前,你需要確保x和d是雙打。 嘗試在REPL:

scala> val x = 1 
scala> val d = 3 
scala> x/d 

一個詮釋由一個Int劃分將導致圓角詮釋,讓你申請開方爲零。

而且由於浮點運算,您可能需要比較喜歡這個:

(Math.sqrt((x * x - 1)/(d * d)).toInt - Math.sqrt((x * x - 1)/(d * d))) <= ZERO 

其中零是由一個非常小的數字替換像0.00001

0

因爲這是整數除法,你是檢查((x*x-1)/(d*d)).toInt是否是一個完美的正方形。您可以將所有內容都轉換爲雙精度,但如果您想保留整數範圍,請檢查分割結果是否爲整數:

(x*x-1 % d*d == 0) && Math.sqrt(y).toInt == Math.sqrt(y) 
相關問題