求 x * 99 + y * 199 最接近 1159 的 x、y 的组合

April · 2017-07-22 02:46:32 · 3157 次点击

ax+by=c,这就是个斜线方程。xy如果是取float,根本就有无穷的解,只有当xy均为整数,且均大于0问题才成立。<br>

<p> func getXY(){<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp;x := 0<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp;a := 100<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp;b := 200<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp;c := 1159<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp;m := 1.0<br /> <span></span>&nbsp; &nbsp; &nbsp; min := float64(c)<br /> <span></span>&nbsp; &nbsp; &nbsp; r := [2]int{}<br /> <span></span>&nbsp; &nbsp; &nbsp; var d,e float64<br /> <span></span>&nbsp; &nbsp; &nbsp; for m &gt;= 0 {<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m = float64(c - a x)/float64(b)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d = math.Abs(float64(ax+bint(m)-c))<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e = math.Abs(float64(ax+bint(m+1)-c))<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if d &gt; e{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if e == 0{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("最小差值:",e)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("xy取值:",r)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}else if e &lt; min{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min = e<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r[0] = x<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r[1] = int(m+1)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}else {<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if d == 0{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[0] = x<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[1] = int(m)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println("最小差值:",d)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println("xy取值:",r)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}else if d &lt; min{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min = d<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r[0] = x<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r[1] = int(m)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x++<br /> <span></span>&nbsp; &nbsp; &nbsp; }<br /> <span></span>&nbsp; &nbsp; &nbsp; y := 0<br /> <span></span>&nbsp; &nbsp; &nbsp; for m &gt;= 0 {<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m = float64(c - b y)/float64(a)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d = math.Abs(float64(by+aint(m)-c))<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e = math.Abs(float64(by+aint(m+1)-c))<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if d &gt; e{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if e == 0{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[1] = y<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[0] = int(m+1)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println("最小差值:",e)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println("xy取值:",r)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else if e &lt; min{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;min = e<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[1] = y<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[0] = int(m+1)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else {<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if d == 0{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[1] = y<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r[0] = int(m)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println("最小差值:",d)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println("xy取值:",r)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}else if d &lt; min{<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min = d<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r[1] = y<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r[0] = int(m)<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /> <span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;y++<br /> <span></span>&nbsp; &nbsp; &nbsp;}<br /> <span></span>&nbsp; &nbsp; &nbsp;fmt.Println("最小差值:",m)<br /> <span></span>&nbsp; &nbsp; &nbsp;fmt.Println("xy取值:",r)<br /> } </p> <div> <br /> </div> <p> <br /> </p>

#10
更多评论
package main

import (
    "fmt"
    "math"
)

func main() {
    sum := 1159
    a, b := 99, 199
    x, y := find(a, b, sum)
    result := a*x + b*y
    fmt.Println("x=", x, ", y=", y, ", 最接近的值为:", result, " 差值为:", math.Abs(float64(result-sum)))

}

func find(a, b, result int) (x, y int) {
    xx, yy := 0, 0
    for x := 0; ; x++ {
        for y := 0; ; y++ {
            if math.Abs(float64(a*x+b*y-result)) <= math.Abs(float64(a*xx+b*yy-result)) {
                xx = x
                yy = y
            } else {
                return xx, yy
            }
        }
    }
}
#1

另外,你这个算法有问题,1和5的值为 99+5*199=1094,相差65,我这个算出的是: x= 0 , y= 6 , 最接近的值为: 1194 差值为: 35

#2