您好,欢迎访问三七文档
实验五常用算法:枚举法递推法迭代法一、实验目的掌握枚举法,递推法、迭代法这3种常用算法。二、实验内容1.编程求和:s=a+aa+aaa+…+aa…a,其中a是1~9中的一个数字。[提示]令各项为b0,b1,b2,…bn则b0=ab1=b0×10+ab2=b1×10+a…即每一项由前一项乘以10加a递推得到,然后求和。2.编程求出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身,例如153是一个“水仙花数”,因为153=13+53+33。要求采用枚举法。3.范例:设函数f(x)定义在区间[a,b]上,f(x)连续且满足f(a)×f(b)0,求f(x)在[a,b]上的根。采用割线法,迭代公式为:xi+1=xi+(xi-1-xi)/(f(xi)-f(xi-1))*f(xi)其代换规律为:首先用两端点函数值的绝对值较大者的对应点作为xi-1,较小者作为xi,即如果|f(a)||f(b)|,则将a赋给xi-1,将b赋给xi。用迭代公式得出xi+1,f(xi+1)。误差定义为:⊿x=(xi-1-xi)/(f(xi)-f(xi-1))*f(xi)当⊿xε或f(xi+1)==0则结束运算。否则用(xi,f(xi))代替(xi-1,f(xi-1)),(xi+1,f(xi+1))代替(xi,f(xi)),继续迭代。求解方程:x*lg(x)=1的实根的近似值,误差不超过0.001。[提示]令f(x)=xlgx-1,则f(2)≈-0.3980,而f(3)≈0.4310,由此可知根在2与3之间。#includecmath#includeiostreamusingnamespacestd;constmax=30;doublea=2,b=3,ep=0.001;intmain(){intmaxit,j;doublex1,x2,temp,f1,f2,dx;f1=a*log10(a)-1;f2=b*log10(b)-1;if(f1*f2=0){cout初值错!endl;return0;}if(fabs(f1)fabs(f2)){x1=a;n个ax2=b;}else{x1=b;x2=a;temp=f1;f1=f2;f2=temp;}for(j=1;j=max;j++){dx=(x1-x2)*f2/(f2-f1);coutdx;temp=x2;x2=x2+dx;x1=temp;f1=f2;f2=x2*log10(x2)-1;cout'\t'x2endl;if((fabs(dx)ep)||(f2==0)){cout方程的根为:x2endl;return0;}}cout迭代次数过多!endl;return1;}4.范例:由0到4五个数字,组成五位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。#includeiostreamusingnamespacestd;intmain(){inti,j,k,l,m,count=0;for(i=1;i=4;i++){for(j=0;j=4;j++){if(j==i)continue;for(k=0;k=4;k++){if(k==3||k==i||k==j)continue;for(l=0;l=4;l++){if(l==3||l==i||l==j||l==k)continue;for(m=0;m=4;m++){if(m==i||m==j||m==k||m==l)continue;coutijklm'\t';count++;if(count%5==0)coutendl;}}}}}return0;}穷举法采用循环语句,对须剔除的情况,应在循环体内用条件语句实现,并使用continue语句,不可以使用break语句。如果放在循环条件中,则必然会出错。==开始
本文标题:常用算法枚举法
链接地址:https://www.777doc.com/doc-2452254 .html