Compute the square root of a positive integer using binary searchInteger square root in x86 assembly (NASM)Epilogue to a binary search to find the range of matching indexesBinary search that gets ALL matching resultsBinary search of an integer arraySend a tweet to ISP when internet speed dropsNavigating over a square spiralSwiftly counting rooms in a floor planHashTable using C
How do the Durable and Dwarven Fortitude feats interact?
Are there any OR challenges that are similar to kaggle's competitions?
Why was ramjet fuel used as hydraulic fluid during Saturn V checkout?
What are some tips and tricks for finding the cheapest flight when luggage and other fees are not revealed until far into the booking process?
What would cause a nuclear power plant to break down after 2000 years, but not sooner?
From where do electrons gain kinetic energy through a circuit?
Designing a prison for a telekinetic race
When does The Truman Show take place?
Why is the battery jumpered to a resistor in this schematic?
Have made several mistakes during the course of my PhD. Can't help but feel resentment. Can I get some advice about how to move forward?
Programming a recursive formula into Mathematica and find the nth position in the sequence
Are there any rules on how characters go from 0th to 1st level in a class?
Why do aircraft leave cruising altitude long before landing just to circle?
Build a mob of suspiciously happy lenny faces ( ͡° ͜ʖ ͡°)
My new Acer Aspire 7 doesn't have a Legacy Boot option, what can I do to get it?
global variant of csname…endcsname
Why should P.I be willing to write strong LOR even if that means losing a undergraduate from his/her lab?
Did they ever see Truman doing any private things when filming him for 24 hours 7 days a week?
Trying to understand how Digital Certificates and CA are indeed secure
Gofer work in exchange for Letter of Recommendation
What's a good pattern to calculate a variable only when it is used the first time?
What is the best way to use errors in mathematica M12?
Is this bar slide trick shown on Cheers real or a visual effect?
The anatomy of an organic infrared generator
Compute the square root of a positive integer using binary search
Integer square root in x86 assembly (NASM)Epilogue to a binary search to find the range of matching indexesBinary search that gets ALL matching resultsBinary search of an integer arraySend a tweet to ISP when internet speed dropsNavigating over a square spiralSwiftly counting rooms in a floor planHashTable using C
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
$begingroup$
The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n
is between 0
and n/2
, and the required answer is "floored", meaning mySqrt(8)
is to return 2
.
Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Loop invariant:
The answer is always in the range [low, high] inclusive,
except possibly:
1) low == high == mid, and mid * mid == x and
any of low, high, or mid can be returned as the answer.
2) if there is no exact answer and the floor is to be
returned, then low > high by 1. Since sq != x,
so either low or high is set inside the loop.
If low gets set and gets pushed up, it is pushed up too much.
So when low > high by 1, low - 1 is the answer and it is the same
as high, because low > high by 1.
If high gets set and gets pushed down, high can be
the correct answer. When low > high, it is by 1,
and high is the correct floor value to be returned.
(since there is no perfect square root and the floor is required)
0 <= low <= answer <= high <= n//2 + 1
where answer is floor(sqrt(x)) to be found,
except if low > high and the loop will exit.
Each loop iteration always makes the range smaller.
If the range is empty at the end, low is > high by 1, and high is
the correct floored value, and low is the ceiling value, so high is returned.
"""
low = 0;
high = x//2 + 1;
while (low <= high):
mid = low + (high - low) // 2;
sq = mid * mid;
if (sq == x):
return mid;
elif (sq > x):
high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
else:
low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)
return high;
python algorithm mathematics binary-search
$endgroup$
add a comment |
$begingroup$
The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n
is between 0
and n/2
, and the required answer is "floored", meaning mySqrt(8)
is to return 2
.
Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Loop invariant:
The answer is always in the range [low, high] inclusive,
except possibly:
1) low == high == mid, and mid * mid == x and
any of low, high, or mid can be returned as the answer.
2) if there is no exact answer and the floor is to be
returned, then low > high by 1. Since sq != x,
so either low or high is set inside the loop.
If low gets set and gets pushed up, it is pushed up too much.
So when low > high by 1, low - 1 is the answer and it is the same
as high, because low > high by 1.
If high gets set and gets pushed down, high can be
the correct answer. When low > high, it is by 1,
and high is the correct floor value to be returned.
(since there is no perfect square root and the floor is required)
0 <= low <= answer <= high <= n//2 + 1
where answer is floor(sqrt(x)) to be found,
except if low > high and the loop will exit.
Each loop iteration always makes the range smaller.
If the range is empty at the end, low is > high by 1, and high is
the correct floored value, and low is the ceiling value, so high is returned.
"""
low = 0;
high = x//2 + 1;
while (low <= high):
mid = low + (high - low) // 2;
sq = mid * mid;
if (sq == x):
return mid;
elif (sq > x):
high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
else:
low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)
return high;
python algorithm mathematics binary-search
$endgroup$
add a comment |
$begingroup$
The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n
is between 0
and n/2
, and the required answer is "floored", meaning mySqrt(8)
is to return 2
.
Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Loop invariant:
The answer is always in the range [low, high] inclusive,
except possibly:
1) low == high == mid, and mid * mid == x and
any of low, high, or mid can be returned as the answer.
2) if there is no exact answer and the floor is to be
returned, then low > high by 1. Since sq != x,
so either low or high is set inside the loop.
If low gets set and gets pushed up, it is pushed up too much.
So when low > high by 1, low - 1 is the answer and it is the same
as high, because low > high by 1.
If high gets set and gets pushed down, high can be
the correct answer. When low > high, it is by 1,
and high is the correct floor value to be returned.
(since there is no perfect square root and the floor is required)
0 <= low <= answer <= high <= n//2 + 1
where answer is floor(sqrt(x)) to be found,
except if low > high and the loop will exit.
Each loop iteration always makes the range smaller.
If the range is empty at the end, low is > high by 1, and high is
the correct floored value, and low is the ceiling value, so high is returned.
"""
low = 0;
high = x//2 + 1;
while (low <= high):
mid = low + (high - low) // 2;
sq = mid * mid;
if (sq == x):
return mid;
elif (sq > x):
high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
else:
low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)
return high;
python algorithm mathematics binary-search
$endgroup$
The requirement is to find the square root of a positive integer using binary search and the math property that square root of a number n
is between 0
and n/2
, and the required answer is "floored", meaning mySqrt(8)
is to return 2
.
Please comment on the efficiency, and if possible, the loop invariants in terms of correctness:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Loop invariant:
The answer is always in the range [low, high] inclusive,
except possibly:
1) low == high == mid, and mid * mid == x and
any of low, high, or mid can be returned as the answer.
2) if there is no exact answer and the floor is to be
returned, then low > high by 1. Since sq != x,
so either low or high is set inside the loop.
If low gets set and gets pushed up, it is pushed up too much.
So when low > high by 1, low - 1 is the answer and it is the same
as high, because low > high by 1.
If high gets set and gets pushed down, high can be
the correct answer. When low > high, it is by 1,
and high is the correct floor value to be returned.
(since there is no perfect square root and the floor is required)
0 <= low <= answer <= high <= n//2 + 1
where answer is floor(sqrt(x)) to be found,
except if low > high and the loop will exit.
Each loop iteration always makes the range smaller.
If the range is empty at the end, low is > high by 1, and high is
the correct floored value, and low is the ceiling value, so high is returned.
"""
low = 0;
high = x//2 + 1;
while (low <= high):
mid = low + (high - low) // 2;
sq = mid * mid;
if (sq == x):
return mid;
elif (sq > x):
high = mid - 1; # sq exceeds target, so mid cannot be the answer floored, but when high is set to mid - 1, then it can be the answer
else:
low = mid + 1; # (here sq < x, and mid might be the answer floored, so when low is set to mid + 1, then low might be too big, while high is correct)
return high;
python algorithm mathematics binary-search
python algorithm mathematics binary-search
edited 1 hour ago
太極者無極而生
asked 9 hours ago
太極者無極而生太極者無極而生
1997 bronze badges
1997 bronze badges
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
Your comments on the elif / else part are too long to be just after the statements
Don't use semicolons (;) in Python.
This is a refactored version of the code
import math
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Returns floor(sqrt(x))
"""
low = 0
high = x//2 + 1
"""
It is proved that 0 <= sqrt(x) <= x/2, so
we run a dichotomic in [0, x/2] to find floor(sqrt(x))
Loop analysis:
* Initialization: low = 0 and high = x/2 + 1
* Termination: |high-low| is reduced each iteration,
as shown in lines high = mid - 1 and low = mid + 1.
* Invariant: low <= floor(sqrt(x)) <= high.
Let mid be (low + high)/2.
- If mid^2 <= x < (mid+1)^2,
then mid is floor(sqrt(x)) and just return it.
- If mid^2 > x, search for values smaller than mid.
- Otherwise, if mid^2 < x, search within higher values.
"""
while (low <= high):
mid = (low + high) // 2
sq = mid * mid
sq_next = (mid+1)*(mid+1)
if (sq <= x < sq_next):
return mid
elif (sq > x):
high = mid - 1
else:
low = mid + 1
for i in range(1, 26):
assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))
$endgroup$
$begingroup$
I suppose if it is Python, it can bemid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to becomebignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int
$endgroup$
– 太極者無極而生
9 hours ago
1
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider howlow
orhigh
gets set... interesting... it looks like it can make it simpler loop invariants
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
|
show 3 more comments
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f226340%2fcompute-the-square-root-of-a-positive-integer-using-binary-search%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Your comments on the elif / else part are too long to be just after the statements
Don't use semicolons (;) in Python.
This is a refactored version of the code
import math
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Returns floor(sqrt(x))
"""
low = 0
high = x//2 + 1
"""
It is proved that 0 <= sqrt(x) <= x/2, so
we run a dichotomic in [0, x/2] to find floor(sqrt(x))
Loop analysis:
* Initialization: low = 0 and high = x/2 + 1
* Termination: |high-low| is reduced each iteration,
as shown in lines high = mid - 1 and low = mid + 1.
* Invariant: low <= floor(sqrt(x)) <= high.
Let mid be (low + high)/2.
- If mid^2 <= x < (mid+1)^2,
then mid is floor(sqrt(x)) and just return it.
- If mid^2 > x, search for values smaller than mid.
- Otherwise, if mid^2 < x, search within higher values.
"""
while (low <= high):
mid = (low + high) // 2
sq = mid * mid
sq_next = (mid+1)*(mid+1)
if (sq <= x < sq_next):
return mid
elif (sq > x):
high = mid - 1
else:
low = mid + 1
for i in range(1, 26):
assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))
$endgroup$
$begingroup$
I suppose if it is Python, it can bemid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to becomebignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int
$endgroup$
– 太極者無極而生
9 hours ago
1
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider howlow
orhigh
gets set... interesting... it looks like it can make it simpler loop invariants
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
|
show 3 more comments
$begingroup$
Your comments on the elif / else part are too long to be just after the statements
Don't use semicolons (;) in Python.
This is a refactored version of the code
import math
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Returns floor(sqrt(x))
"""
low = 0
high = x//2 + 1
"""
It is proved that 0 <= sqrt(x) <= x/2, so
we run a dichotomic in [0, x/2] to find floor(sqrt(x))
Loop analysis:
* Initialization: low = 0 and high = x/2 + 1
* Termination: |high-low| is reduced each iteration,
as shown in lines high = mid - 1 and low = mid + 1.
* Invariant: low <= floor(sqrt(x)) <= high.
Let mid be (low + high)/2.
- If mid^2 <= x < (mid+1)^2,
then mid is floor(sqrt(x)) and just return it.
- If mid^2 > x, search for values smaller than mid.
- Otherwise, if mid^2 < x, search within higher values.
"""
while (low <= high):
mid = (low + high) // 2
sq = mid * mid
sq_next = (mid+1)*(mid+1)
if (sq <= x < sq_next):
return mid
elif (sq > x):
high = mid - 1
else:
low = mid + 1
for i in range(1, 26):
assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))
$endgroup$
$begingroup$
I suppose if it is Python, it can bemid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to becomebignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int
$endgroup$
– 太極者無極而生
9 hours ago
1
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider howlow
orhigh
gets set... interesting... it looks like it can make it simpler loop invariants
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
|
show 3 more comments
$begingroup$
Your comments on the elif / else part are too long to be just after the statements
Don't use semicolons (;) in Python.
This is a refactored version of the code
import math
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Returns floor(sqrt(x))
"""
low = 0
high = x//2 + 1
"""
It is proved that 0 <= sqrt(x) <= x/2, so
we run a dichotomic in [0, x/2] to find floor(sqrt(x))
Loop analysis:
* Initialization: low = 0 and high = x/2 + 1
* Termination: |high-low| is reduced each iteration,
as shown in lines high = mid - 1 and low = mid + 1.
* Invariant: low <= floor(sqrt(x)) <= high.
Let mid be (low + high)/2.
- If mid^2 <= x < (mid+1)^2,
then mid is floor(sqrt(x)) and just return it.
- If mid^2 > x, search for values smaller than mid.
- Otherwise, if mid^2 < x, search within higher values.
"""
while (low <= high):
mid = (low + high) // 2
sq = mid * mid
sq_next = (mid+1)*(mid+1)
if (sq <= x < sq_next):
return mid
elif (sq > x):
high = mid - 1
else:
low = mid + 1
for i in range(1, 26):
assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))
$endgroup$
Your comments on the elif / else part are too long to be just after the statements
Don't use semicolons (;) in Python.
This is a refactored version of the code
import math
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
Returns floor(sqrt(x))
"""
low = 0
high = x//2 + 1
"""
It is proved that 0 <= sqrt(x) <= x/2, so
we run a dichotomic in [0, x/2] to find floor(sqrt(x))
Loop analysis:
* Initialization: low = 0 and high = x/2 + 1
* Termination: |high-low| is reduced each iteration,
as shown in lines high = mid - 1 and low = mid + 1.
* Invariant: low <= floor(sqrt(x)) <= high.
Let mid be (low + high)/2.
- If mid^2 <= x < (mid+1)^2,
then mid is floor(sqrt(x)) and just return it.
- If mid^2 > x, search for values smaller than mid.
- Otherwise, if mid^2 < x, search within higher values.
"""
while (low <= high):
mid = (low + high) // 2
sq = mid * mid
sq_next = (mid+1)*(mid+1)
if (sq <= x < sq_next):
return mid
elif (sq > x):
high = mid - 1
else:
low = mid + 1
for i in range(1, 26):
assert(math.floor(math.sqrt(i)) == Solution().mySqrt(i))
edited 8 hours ago
answered 9 hours ago
JnxFJnxF
4384 silver badges13 bronze badges
4384 silver badges13 bronze badges
$begingroup$
I suppose if it is Python, it can bemid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to becomebignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int
$endgroup$
– 太極者無極而生
9 hours ago
1
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider howlow
orhigh
gets set... interesting... it looks like it can make it simpler loop invariants
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
|
show 3 more comments
$begingroup$
I suppose if it is Python, it can bemid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to becomebignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int
$endgroup$
– 太極者無極而生
9 hours ago
1
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider howlow
orhigh
gets set... interesting... it looks like it can make it simpler loop invariants
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
$begingroup$
I suppose if it is Python, it can be
mid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int$endgroup$
– 太極者無極而生
9 hours ago
$begingroup$
I suppose if it is Python, it can be
mid = (low + high) // 2
because there is infinite precision arithmetics... but it just depends whether you want it first to overflow (either 32 bit or 64 bit int) to become bignum
, and then divided by 2 to make it back to a 32 bit or 64 bit int$endgroup$
– 太極者無極而生
9 hours ago
1
1
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
@太極者無極而生 Take a look to the new answer; now there is no need for returning high or low after the loop, so it is easier to reason about.
$endgroup$
– JnxF
9 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how
low
or high
gets set... interesting... it looks like it can make it simpler loop invariants$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
you are using $$mid^2$$ and $$ (mid+1)^2 $$ to check for the answer and return and no need to consider how
low
or high
gets set... interesting... it looks like it can make it simpler loop invariants$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
how come you assert from 1 to 26 instead of from 1 to some larger number like... 5000 or a million
$endgroup$
– 太極者無極而生
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
$begingroup$
@太極者無極而生 Code is proved to be correct mathematically, so you can check up to any number you want. Checked up to $1000000$ and it works (surely, you can try up to any number you want).
$endgroup$
– JnxF
8 hours ago
|
show 3 more comments
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f226340%2fcompute-the-square-root-of-a-positive-integer-using-binary-search%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown