实验五常用算法:枚举法递推法迭代法
一、实验目的
掌握枚举法,递推法、迭代法这3种常用算法。
二、实验内容
1.编程求和:
[提示] 令各项为b0,b1,b2,…bn
则b0 = a
b1 = b0×10+a
b2 = 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]上的根。
采用割线法,迭代公式为:
x i+1= x i+( x i-1- x i)/(f(x i)-f(x i-1))*f(x i)
其代换规律为:首先用两端点函数值的绝对值较大者的对应点作为x i-1,较小者
作为x i,即如果|f(a)|<|f(b)|,则将a赋给x i-1,将b赋给x i。
用迭代公式得出x i+1,
f(x i+1)。
误差定义为:
⊿x =( x i-1- x i)/(f(x i)-f(x i-1))*f(x i)
当⊿x<ε或f(x i+1)==0则结束运算。
否则用(x i,f(x i))代替(x i-1,f(x i-1)),(x i+1,f(x i+1))代替(x i,f(x i)),继续迭代。
求解方程:x*lg(x)=1的实根的近似值,误差不超过0.001。
[提示]令 f(x)=xlgx-1,则f(2)≈-0.398<0,而f(3)≈0.431>0,由此可知根
在2与3之间。
#include <cmath>
#include <iostream>
using namespace std;
const max=30;
double a=2,b=3,ep=0.001;
int main(){
int maxit,j;
double x1,x2,temp,f1,f2,dx;
f1=a*log10(a)-1;
f2=b*log10(b)-1;
if(f1*f2>=0){
cout<<"初值错!"<<endl;
return 0;
}
if(fabs(f1)<fabs(f2)){
x1=a;
x2=b;
}
else{
x1=b;
x2=a;
temp=f1;
f1=f2;
f2=temp;
}
for(j=1;j<=max;j++){
dx=(x1-x2)*f2/(f2-f1);
cout<<dx;
temp=x2;
x2=x2+dx;
x1=temp;
f1=f2;
f2=x2*log10(x2)-1;
cout<<'\t'<<x2<<endl;
if((fabs(dx)<ep)||(f2==0)){
cout<<"方程的根为:"<<x2<<endl;
return 0;
}
}
cout<< "迭代次数过多!"<<endl;
return 1;
}
4. 范例:由0到4五个数字,组成五位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。
#include<iostream>
using namespace std;
int main(){
int i,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;
cout<<i<<j<<k<<l<<m<<'\t';
count++;
if(count%5==0) cout<<endl;}}}}}
return 0;
}
穷举法采用循环语句,对须剔除的情况,应在循环体内用条件语句实现,并
使用continue语句,不可以使用break语句。
如果放在循环条件中,则必然会出错。
==。