我们一起解题目吧!

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

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

图片

话题扯回来…

正文!

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

题目:

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

思维导图:

图片

当时写的代码:

# 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加到最后超范围,则说明解完了!

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

最后结果:

在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,有点不爽(当时没反应过来).
蛋疼的是输出结果还是双精度的…

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

# 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;
 }
......
在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

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

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


 目录