1

我们一起解题目吧!

 2 years ago
source link: https://blog.cyfan.top/p/992e034c.html?time=33209449074293810000
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
我们一起解题目吧! || 陈YFの博客( ̄▽ ̄)"
|
2020年1月24日 晚上
1.8k字 26 分钟 loading 阅读量

除夕快乐!
哎呀,作为一个贫困的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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK