当前位置 博文首页 > Janbar:一个数加100是完全平方数,再加168又是一个完全平方数

    Janbar:一个数加100是完全平方数,再加168又是一个完全平方数

    作者:[db:作者] 时间:2021-06-17 18:17

    1.说明

    1. 暴力法都知道,但是如果起始没弄好会忽略-99这个数
    2. 更优的解法需要好的思路
    package main
    
    import (
        "fmt"
        "math"
    )
    
    func main() {
        /**
         * 常规解法,暴力找到合适的数
         * 因为a>=0 且 b>=0,因此i从-100开始
         **/
        for i := -100; i < 10000; i++ {
            a, b := int(math.Sqrt(float64(i+100))), int(math.Sqrt(float64(i+100+168)))
            if a*a == (i+100) && b*b == (i+100+168) {
                fmt.Println(i)
            }
        }
        /**
         * 设要找的数为n则满足如下方程
         * A = n+100 = x * x
         * B = n+100+168 = y * y
         * 因为B>A,所以可以设y = x+z,z > 0
         * 因此B = n+100+168 = (x+z) * (x+z)
         * B-A 可以推出: 168 = (x+z) * (x+z) - x*x
         * 最终得出x = 84/z - z/2,因为x > 0,所以0 < z <= 13
         * 遍历1<= z <=13,得到x,根据A的等式可得出n = x * x - 100
         * 因为用了除法,所以使用浮点数运算,满足条件时z/x/n全是整数
         **/
        for z := float64(1); z <= 13; z++ {
            x := 84/z - z/2
            if float64(int(x)) == x {
                fmt.Println(int(x*x - 100))
            }
        }
    }