GoLang求大数据黄金分割比小数点后无限位

黄金分割比是把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这个数值的作用不仅仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用。黄金分割点是指分一线段为两部分,使得原来线段的长跟较长的那部分的比为黄金分割的点。线段上有两个这样的点。

package main

import (
	"fmt"
)

type myInt int32

const (
	SIZE      = 120  //数组长度 数据长度小于:120*9
	TIMES     = 5150 //ab交换次数
	PRESIZE   = 2000 //数字的有效位数
)

/*
*代码作者:天之
*博客:
 */
func main() {
	a, b, tmp, res := make([]myInt, SIZE), make([]myInt, SIZE), make([]myInt, SIZE), make([]byte, PRESIZE)
	initAB(a, b)
	gab(a, b, tmp)
	//printBigNum(a)
	//printBigNum(b)
	bigNumDiv(a, b, tmp, res)
	fmt.Println(res)
}

/*复制整型数组*/
func cpyMyIntArr(d, s []myInt) {
	for i := 0; i < SIZE; i++ {
		d[i] = s[i]
	}
}

/*大数之和,a=a+b*/
func bigNumSum(a, b []myInt) {
	for i := 0; i < SIZE; i++ {
		count := a[i] + b[i]
		//因为已知a[i]和b[i]都是九位数内的
		if count > 1000000000 {
			a[i+1] += 1
			a[i] = count - 1000000000
		} else {
			a[i] = count
		}
	}
	//如果不存在a[i+1],这时就溢出了,在输入时需要控制
}

/*十倍值,a=10*a*/
func bigNum10(a, tmp []myInt) {
	cpyMyIntArr(tmp, a)
	for i := 0; i < 9; i++ {
		bigNumSum(a, tmp)
	}
}

/*大数之差,a=a-b*/
func bigNumDif(a, b, tmp []myInt) int16 {
	cpyMyIntArr(tmp, a)
	for i := 0; i < SIZE; i++ {
		count := a[i] - b[i]
		if count < 0 {
			if i < SIZE-1 {
				a[i+1] -= 1
				a[i] = 1000000000 + count
			} else {
				cpyMyIntArr(a, tmp)
				return 0
			}

		} else {
			a[i] = count
		}

	}
	for i := SIZE - 1; i >= 0; i-- {
		if a[i] < 0 {
			cpyMyIntArr(a, tmp)
			return 0
		}
	}
	return 1
}

/*模拟除法运算res=b/a,进入运算时b<a*/
func bigNumDiv(a, b, tmp []myInt, res []byte) {
	var count byte
	for i := 0; i < PRESIZE; i++ {
		count = 0
		for bigNumDif(b, a, tmp) == 1 {
			count++
		}
		res[i] = count
		bigNum10(b, tmp)
	}
}

/*生成比例数,b/a --> a/(b+a)*/
func gab(a, b, tmp []myInt) {
	for i := 0; i < TIMES; i++ {
		cpyMyIntArr(tmp, a)
		bigNumSum(a, b)
		cpyMyIntArr(b, tmp)
	}
}

/*初始化ab数组*/
func initAB(a, b []myInt) {
	for i := 1; i < SIZE; i++ {
		a[i] = 0
		b[i] = 0
	}
	a[0] = 3
	b[0] = 2
}

/*打印大数据数组*/
func printBigNum(a []myInt) {
	for i := SIZE - 1; i >= 0; i-- {
		fmt.Printf("%10d", a[i])
	}
	fmt.Println()
}
//引用自http://blog.csdn.net/wapwo/article/details/8937881

转载请注明来源:新一 » GoLang求大数据黄金分割比小数点后无限位

赞 (0) 评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址