浙江大学数据结构课程的课后作业,最近一直在学习Go语言,觉得差不多可以换把武器用用了,第一次用Go,还是花了不少时间来写。
-----------------------------------------------------------------------------------------------------------
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
---------------------------------------------------------------------------------------------------------
fmt.Scanf这个函数要求两个返回值,传入的参数是直接是地址,所以粗略的写写返回值是不需要的,在go语言里可以用"_"来占位,抛弃返回值,但是不能全部抛弃,所以形式上看起来不是很简洁。
01
package
main
02
03
import (
04
"fmt"
05
"math"
06 )
07
08
func
main()
{
09
var
a3
float64
10
var
a2
float64
11
var
a1
float64
12
var
a0
float64
13
var
little
float64
14
var
big
float64
15
16
_
,
err
:=
fmt
.
Scanf(
"%f %f %f %f\n"
,&
a3
,&
a2
,&
a1
,&
a0)
17
if
err
!=
nil
{
18
fmt
.
Println(
"error"
,
err)
19
}
20
aiSlice
:=
[]
float64
{
a3
,
a2
,
a1
,
a0
}
21
22
_
,
err
=
fmt
.
Scanf(
"%f %f"
,&
little
,&
big)
23
if
err
!=
nil
{
24
fmt
.
Println(
"error"
,
err)
25
}
26
//work
27
result
:=
find(
aiSlice
,
little
,
big)
28
fmt
.
Printf(
"%.2f"
,
result)
29
30
}
31
32
func
find(
data
[]
float64
,
littleNum
float64
,
bigNum
float64) (
result
float64
){
33
//检测区间长度
34
var
fab
float64
35
for(
bigNum
-
littleNum
)>
0.01
{
//不用计算了,已经小于要求精度
36
//if fafb := caculate(data,littleNum)*caculate(data,bigNum); fafb<0{//在此区间有解
37
ab
:= (
bigNum
+
littleNum
)/
2
//取中间点
38
fab
=
caculate(
data
,
ab)
39
if
fab
==
0
{
40
break
41
}
else
if
fab
*
caculate(
data
,
bigNum
)>
0
{
42
bigNum
=
ab
43
}
else
{
44
littleNum
=
ab
45
}
46
//}
47
}
48
return (
bigNum
+
littleNum
)/
2
49
}
50
51
func
caculate(
data
[]
float64
,
x
float64) (
y
float64
){
52
for
i
,
ai
:=
range
data
{
53
y
+=
ai
*
math
.
Pow(
x
,
float64(
3
-
i))
54
}
55
return
y
56
}
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56