我们一起解题目吧!

除夕快乐!
哎呀,作为一个贫困的blogger,我似乎没有什么礼物。
今天是己亥年的最后一日,快乐度过吧!

话题扯一下新型冠状病毒,大家一定要注意人身安全,假期家里蹲就好了!
中国加油!武汉加油!

图片

话题扯回来…

正文!

整理书的时候看到了一张纸,突然想起来这是当天偷偷在数学课上写的代码,结果被班主任发现骂了一顿。
题目非常有趣,是这样的:

题目:

在f(x)=ax^2+bx+c中,若有两个不等的实数根且在-0.25至0.25间,求a+b+c的最小值。

思维导图:

图片

当时写的代码:

1
2
3
4
5
6
7
8
9
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
# include <stdio.h>
# include <math.h>
# include <iostream>
using namespace std;
int main (){
int min=100;
int i;
double mid,root,a,b,c,a1,b1,c1,delta;
a=b=c=1;
for(;a+b+c<=min;i++){
printf("在a=%lf ,b=%lf ,c=%lf 时",a,b,c);
delta=b*b-4*a*c;
if(delta>0){
mid=(-b/2)/a;
root=((sqrt(delta))/2)/a;
if((mid+root)>(-0.25) and (mid+root)<0.25){
if((mid-root)>(-0.25) and (mid-root)<0.25){
if(a+b+c<min){
a1=a;
b1=b;
c1=c;
min=a+b+c;
printf("有min=%d !\n",min);
}else cout<<"a+b+c不是min值!"<<endl;
}else cout<<"较小值超出范围!"<<endl;
}else cout<<"较大值超出范围!"<<endl;
}else cout<<"没有两不等实根!"<<endl;
a++;
if(a+b+c>min){
a=1;
b++;
if(a+b+c>min){
b=1;
c++;
}
}
}
cout<<"共循环 "<<i<<" 次,a+b+c的最小值是"<<min<<",此时a="<<a1<<",b="<<b1<<",c="<<c1<<endl;
return 0;
}

代码的核心是枚举,从a=b=c=1开算解,不符合就C自加一,c达到当时最小之后,c回到起点,从b开加,以此类推,如果a加到最后超范围,则说明解完了!

1
2
3
4
5
6
7
编译结果...
--------
- 错误: 0
- 警告: 0
- 输出文件名: C:\Users\CYF\Desktop\函数解题.exe
- 输出大小: 1.83758735656738 MiB
- 编译时间: 1.75s

最后结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
在a=35.000000,b=4.000000,c=1.000000时,有没有两不等实根!
在a=35.000000,b=4.000000,c=2.000000时,有没有两不等实根!
在a=35.000000,b=5.000000,c=1.000000时,有没有两不等实根!
在a=36.000000,b=1.000000,c=1.000000时,有没有两不等实根!
在a=36.000000,b=1.000000,c=2.000000时,有没有两不等实根!
在a=36.000000,b=1.000000,c=3.000000时,有没有两不等实根!
在a=36.000000,b=1.000000,c=4.000000时,有没有两不等实根!
在a=36.000000,b=2.000000,c=1.000000时,有没有两不等实根!
在a=36.000000,b=2.000000,c=2.000000时,有没有两不等实根!
在a=36.000000,b=2.000000,c=3.000000时,有没有两不等实根!
在a=36.000000,b=3.000000,c=1.000000时,有没有两不等实根!
在a=36.000000,b=3.000000,c=2.000000时,有没有两不等实根!
在a=36.000000,b=4.000000,c=1.000000时,有没有两不等实根!
在a=37.000000,b=1.000000,c=1.000000时,有没有两不等实根!
在a=37.000000,b=1.000000,c=2.000000时,有没有两不等实根!
在a=37.000000,b=1.000000,c=3.000000时,有没有两不等实根!
在a=37.000000,b=2.000000,c=1.000000时,有没有两不等实根!
在a=37.000000,b=2.000000,c=2.000000时,有没有两不等实根!
在a=37.000000,b=3.000000,c=1.000000时,有没有两不等实根!
在a=38.000000,b=1.000000,c=1.000000时,有没有两不等实根!
在a=38.000000,b=1.000000,c=2.000000时,有没有两不等实根!
在a=38.000000,b=2.000000,c=1.000000时,有没有两不等实根!
在a=39.000000,b=1.000000,c=1.000000时,有没有两不等实根!
共循环 102937 次,a+b+c的最小值是41,此时a=29,b=11,c=1

--------------------------------
Process exited after 160.06 seconds with return value 0

后来发现从c开始加有点费劲,而且一边有cout,另一边用printf,有点不爽(当时没反应过来).
蛋疼的是输出结果还是双精度的…

改了一下,顺便附上解释:

1
2
3
4
5
6
7
8
9
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
# include <stdio.h>
# include <math.h>
# include <iostream>
using namespace std;
int main (){
int min=100;
int i;//定义循环
double mid,root,a,b,c,a1,b1,c1,delta;//此处必须双精度,否则会算出3,5,2这一组
a=b=c=1;//设定起点
for(;a+b+c<=min;i++){//开始循环
cout<<"在a="<<a<<",b="<<b<<"c="<<c<<",的情况下:";//头输出
delta=b*b-4*a*c;//定义delta
if(delta>0){//有无双实根?
mid=(-b/2)/a;
root=((sqrt(delta))/2)/a;//这两步就是算解
if((mid+root)>(-0.25) and (mid+root)<0.25){//x1范围?
if((mid-root)>(-0.25) and (mid-root)<0.25){//x2范围?
if(a+b+c<min){
a1=a;
b1=b;
c1=c;
min=a+b+c;//重新设定阈值
printf("有min=%d !\n",min);
}else cout<<"a+b+c不是min值!"<<endl;//不解释
}else cout<<"较小值超出范围!"<<endl; //同上
}else cout<<"较大值超出范围!"<<endl; //同上
}else cout<<"没有两不等实根!"<<endl; //同上
b++;//还是b开加快一点
if(a+b+c>min){
b=1;
c++;
if(a+b+c>min){
c=1;
a++;
}
}
}
cout<<"共循环 "<<i<<" 次,a+b+c的最小值是"<<min<<",此时a="<<a1<<",b="<<b1<<",c="<<c1<<endl; //最后输出
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
......
在a=35,b=1c=5,的情况下:没有两不等实根!
在a=36,b=1c=1,的情况下:没有两不等实根!
在a=36,b=2c=1,的情况下:没有两不等实根!
在a=36,b=3c=1,的情况下:没有两不等实根!
在a=36,b=4c=1,的情况下:没有两不等实根!
在a=36,b=1c=2,的情况下:没有两不等实根!
在a=36,b=2c=2,的情况下:没有两不等实根!
在a=36,b=3c=2,的情况下:没有两不等实根!
在a=36,b=1c=3,的情况下:没有两不等实根!
在a=36,b=2c=3,的情况下:没有两不等实根!
在a=36,b=1c=4,的情况下:没有两不等实根!
在a=37,b=1c=1,的情况下:没有两不等实根!
在a=37,b=2c=1,的情况下:没有两不等实根!
在a=37,b=3c=1,的情况下:没有两不等实根!
在a=37,b=1c=2,的情况下:没有两不等实根!
在a=37,b=2c=2,的情况下:没有两不等实根!
在a=37,b=1c=3,的情况下:没有两不等实根!
在a=38,b=1c=1,的情况下:没有两不等实根!
在a=38,b=2c=1,的情况下:没有两不等实根!
在a=38,b=1c=2,的情况下:没有两不等实根!
在a=39,b=1c=1,的情况下:没有两不等实根!
共循环 102347 次,a+b+c的最小值是41,此时a=29,b=11,c=1

--------------------------------
Process exited after 142.5 seconds with return value 0

果然快了不少!也少循环一段时间!

★,°:.☆( ̄▽ ̄)/$:.°★ 。撒花!落幕!!

本文标题:我们一起解题目吧!

文章作者:CYF

发布时间:2020年01月24日 - 23:57:39

最后更新:2020年01月24日 - 22:19:48

原始链接:https://blog.cyfan.ga/2020/01/24/我们一起解题目吧!/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%