一道数学题目
2013-11-28 14:42
204 查看
今天一同学问我一道数学题,要用代码求出结果。题目如下图:
我感觉题目的主要要处理的地方就是变量,有点多。下面是我写的代码,采用暴力方式寻找alpha,很臃肿。
这些是用到的一些数据,名字和题目中对应,都是全局变量。本来没这么多,后来写着写着发现参数传来传去把我搞晕了,索性都全局了。
下面是求解题目中第一个式子,这个很好处理:
然后是求解题目中第二个式子,这个写的一团糟:
因为k,n的个数比较少,所以他要求的k/n为最简真分数我是自己找出来的,即代码中的kn,没有写代码。简化了一些代码,但到后面要求输出k时我就傻眼了,只好又弄了个k[4]数组,将kn*n计算出k。。。。这里遇到两个个问题,一个是最开始我写的是 k[num] = (int)kn*n; 作了强制转换,但结果输出的k全都是0,很是费解。另一个问题是,我做单步调试的时候到了这一步,总是出现这个提示,没法在调试了,查了很多资料也没搞明白。
剩下的便是主函数了,主要嵌套循环,代入各个变量,寻找最佳alpha:
完整的代码如下:
运行结果如下:
虽然是个小程序,但还是发现了许多问题要解决,很多细节掌握的还不好,有待改进学习。
我感觉题目的主要要处理的地方就是变量,有点多。下面是我写的代码,采用暴力方式寻找alpha,很臃肿。
这些是用到的一些数据,名字和题目中对应,都是全局变量。本来没这么多,后来写着写着发现参数传来传去把我搞晕了,索性都全局了。
#define PI 3.1415926 double D=860,LC=3200,d=430,b=5,LE=330; double a;//a(alpha) int n,N;
下面是求解题目中第一个式子,这个很好处理:
float res_t(void) { float temp; temp = 2*LC*tan(a)/D+2*(PI/2+asin((2*LE*tan(a)-d)/D)); return temp; }
然后是求解题目中第二个式子,这个写的一团糟:
//这几个变量也是全局的 int k[4]; int num; float n_res[4]; float p_res[4]; void res_T_temp(float kn) { k[num] = kn*n; p_res[num] = ((kn+N)*2*PI+2*b/(n*D*cos(a))); n_res[num] = ((kn+N)*2*PI-2*b/(n*D*cos(a))); ++num; } //处理各个k/n void res_T(void) { switch (n) { case 2: res_T_temp(1.0/2);break; case 3: res_T_temp(1.0/3); res_T_temp(2.0/3);break; case 4: res_T_temp(1.0/4); res_T_temp(3.0/4);break; case 5: res_T_temp(1.0/5); res_T_temp(2.0/5); res_T_temp(3.0/5); res_T_temp(4.0/5);break; case 6: res_T_temp(1.0/6); res_T_temp(5.0/6);break; default :break; } }
因为k,n的个数比较少,所以他要求的k/n为最简真分数我是自己找出来的,即代码中的kn,没有写代码。简化了一些代码,但到后面要求输出k时我就傻眼了,只好又弄了个k[4]数组,将kn*n计算出k。。。。这里遇到两个个问题,一个是最开始我写的是 k[num] = (int)kn*n; 作了强制转换,但结果输出的k全都是0,很是费解。另一个问题是,我做单步调试的时候到了这一步,总是出现这个提示,没法在调试了,查了很多资料也没搞明白。
剩下的便是主函数了,主要嵌套循环,代入各个变量,寻找最佳alpha:
int main() { //为了便于计算,角度都化成了弧度,式子相应化简 //输出结果也是弧度 float T,t;//T(theta n-k),t(theta t) double lmt = 0.001*2*PI/360; cout<<"alpha\t\tn\tk\tN"<<endl; for(a=0;a<PI/2;a+=0.00001) { t = res_t(); for(N=1;N<9;N++) { for(n=2;n<7;n++) { num=0; res_T(); for(int i=0;i<num;i++) { T = n_res[i]; if(fabs(T-2*t)<lmt) cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; T = p_res[i]; if(fabs(T-2*t)<lmt) cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; } } } } return 0; }
完整的代码如下:
#include<iostream> #include<math.h> #define PI 3.1415926 double D=860,LC=3200,d=430,b=5,LE=330; double a;//a(alpha) int n,N; int k[4]; int num; float n_res[4]; float p_res[4]; using namespace std; float res_t(void) { float temp; temp = 2*LC*tan(a)/D+2*(PI/2+asin((2*LE*tan(a)-d)/D)); return temp; } void res_T_temp(float kn) { k[num] = kn*n; p_res[num] = ((kn+N)*2*PI+2*b/(n*D*cos(a))); n_res[num] = ((kn+N)*2*PI-2*b/(n*D*cos(a))); ++num; } void res_T(void) { switch (n) { case 2: res_T_temp(1.0/2);break; case 3: res_T_temp(1.0/3); res_T_temp(2.0/3);break; case 4: res_T_temp(1.0/4); res_T_temp(3.0/4);break; case 5: res_T_temp(1.0/5); res_T_temp(2.0/5); res_T_temp(3.0/5); res_T_temp(4.0/5);break; case 6: res_T_temp(1.0/6); res_T_temp(5.0/6);break; default :break; } } int main() { //为了便于计算,角度都化成了弧度,式子相应化简 //输出结果也是弧度 float T,t;//T(theta n-k),t(theta t) double lmt = 0.001*2*PI/360; cout<<"alpha\t\tn\tk\tN"<<endl; for(a=0;a<PI/2;a+=0.00001) { t = res_t(); for(N=1;N<9;N++) { for(n=2;n<7;n++) { num=0; res_T(); for(int i=0;i<num;i++) { T = n_res[i]; if(fabs(T-2*t)<lmt) cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; T = p_res[i]; if(fabs(T-2*t)<lmt) cout<<a<<"\t\t"<<n<<"\t"<<k[i]<<"\t"<<N<<endl; } } } } return 0; }
运行结果如下:
虽然是个小程序,但还是发现了许多问题要解决,很多细节掌握的还不好,有待改进学习。
相关文章推荐
- 家里蹲大学数学杂志第7卷第481期一道实分析题目参考解答
- 数学与程序的结合——一道游戏题目的快速解法
- 求救高手:一道数学几何题目
- 一次数学比赛,共有A,B和C三道题目。所有人都至少解答出一道题目,总共有25人----网易游戏笔试题
- ACM : 一道基础数学题目POJ 1423 …
- poj2363+把题目弄懂就很简单了一道数学题
- 无聊解一道数学题:喝农药杀人(这什么题目!!??)
- 一道智力题的数学解
- 大苏格兰2015年中学等级考试的一道初等数学题
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- HDU 5621 KK's Point(简单的数学题目)
- 今天做的一道题目,没有优化,超时限了
- HDOJ 题目2108Shape of HDU(数学)
- 蓝桥杯 C/C++参考题目 开平方(数学题,迭代法求开方)
- hdu 1760 一道搜索博弈题 挺新颖的题目
- 一道小学五年级的数学暑假作业引人思考
- 入坑pwn第一题,在我们学校最厉害的学长帮助下解决了这一道最简单的题目
- 一道关于随机数生成的题目
- 一道趣题(数学)
- 阿里巴巴一道笔试题目(待更加细致的修正)