The problem
On this problem, you’ll be given a quantity n (n > 0) and your activity shall be to return the smallest sq. quantity N (N > 0) such that n + N can be an ideal sq.. If there isn’t a reply, return -1 (nil in Clojure, Nothing in Haskell, None in Rust).
clear up 13 = 36
<em>; as a result of 36 is the smallest good sq. that may be added to 13 to type an ideal sq. => 13 + 36 = 49</em>
clear up 3 = 1 <em>; 3 + 1 = 4, an ideal sq.</em>
clear up 12 = 4 <em>; 12 + 4 = 16, an ideal sq.</em>
clear up 9 = 16
clear up 4 = nil
The answer in Golang
Possibility 1:
package deal answer
func Remedy(n int) int {
res := -1
for i:= 1; i * i < n; i++ {
if n % i == 0 && (n / i - i) % 2 == 0 {
res = (n / i - i) * (n / i - i) / 4
}
}
return res
}
Possibility 2:
package deal answer
import "math"
func Remedy(n int) int {
// n+a**2==b**2 => n=b2-a2=(a-b)(a+b) => b=(c+d)/2; a=d-b
for i := int(math.Sqrt(float64(n))); i > 0; i-- {
if npercenti == 0 {
c, d := i, n/i
b := (c + d) / 2
a := d - b
if a > 0 && n+a*a == b*b { return a * a }
}
}
return -1
}
Possibility 3:
package deal answer
import "math"
func Remedy(n int) int {
upperBound := n
lowerBound := 1
for lowerBound <= upperBound {
sq. := lowerBound*lowerBound
numToCheck := math.Sqrt(float64(sq. + n))
if math.Ground(numToCheck) == math.Ceil(numToCheck) {
return sq.
}
lowerBound++
}
return -1
}
Take a look at circumstances to validate our answer
package deal solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Instance assessments", func() {
It("It ought to work for fundamental assessments", func() {
Anticipate(Remedy(1)).To(Equal(-1))
Anticipate(Remedy(2)).To(Equal(-1))
Anticipate(Remedy(3)).To(Equal(1))
Anticipate(Remedy(4)).To(Equal(-1))
Anticipate(Remedy(5)).To(Equal(4))
Anticipate(Remedy(7)).To(Equal(9))
Anticipate(Remedy(8)).To(Equal(1))
Anticipate(Remedy(9)).To(Equal(16))
Anticipate(Remedy(10)).To(Equal(-1))
Anticipate(Remedy(11)).To(Equal(25))
Anticipate(Remedy(13)).To(Equal(36))
Anticipate(Remedy(17)).To(Equal(64))
Anticipate(Remedy(88901)).To(Equal(5428900))
Anticipate(Remedy(290101)).To(Equal(429235524))
})
})