2017-07-18 66 views
-2

我想找到兩個數字A,B(數字可以是正數/負數)之間的完美平方。我也想實現O(sqrt(abs(B)))的時間複雜度。如何找到2個數字之間的整個方塊

我寫了下面的代碼是:

count = (int)(Math.floor(Math.sqrt(Math.abs(B)) - Math.ceil(Math.sqrt(Math.abs(A))) + 1); 

這通常效果很好,但是當範圍是-ve到+數字已經失敗。

例如是範圍爲A = 1,B = 1。然後我認爲它應該返回2(0,1),但返回1

我無法找到在其他的答案的溶液中SO。所以,任何幫助將不勝感激。

+4

爲什麼使用C++標籤? – UnholySheep

+0

我很滿意Java/C++的解決方案。我對邏輯更感興趣 – Sushil

+0

'floor(sqrt(abs(1)))'是1,'ceil(sqrt(abs(-1)))'是1,所以如果你從另一箇中減去一個並加1得到... 1.這裏有什麼問題?除此之外,請記住,使用雙精度可能會導致精度問題,因此將其轉換爲int可能會產生意想不到的結果。 – Thomas

回答

1

不會有完美的平方(除非我們有i考慮-infinity 0號碼所以,你可以/應該扔在開局不利數一個IllegalArgumentException,或者僅僅是一個開始設置爲0

+0

我同意。但我認爲0是完美的正方形。所以,它應該被計數 – Sushil

+0

@Sushil也許我的數學算法今天不工作,但它看起來像你做我建議你的計數公式計算1 - 0 + 1 = 2,這是你想要的嗎? – ControlAltDel

+0

我認爲你對此是正確的。有了這個改變,我會得到正確的計數 – Sushil

3

我們假定A,B≥0

然後A≤N²≤B等效於√A≤N≤whisky,並且小區(√A)≤N≤地板(whisky,)。

因此, (√B) - ceil(√A)+1。

如果A < 0,則將A替換爲0.然後,如果B < A沒有解決方案。


更新由@Bathsheba

最後,如果你不想0被認爲是一個完全平方數千萬然後替換 「如果一個< 0,0代替A」「如果A < 1,用1替換A.「

+0

是上級答案。一個分析,其中A> 0和B> = A將是蛋糕上的糖霜。(我從0不是一個完美的方隊,除非你推廣到複雜的平面)。 – Bathsheba

+0

@Bathsheba:如果A <1將A替換爲1. –

+0

確實;如果那是在答案中,那麼如果可以的話我會再次投票。 – Bathsheba

相關問題