**穷举法**
基本思想是:首先依据题目的部分条件确定答案的大致范围,然后在此范围内对所有的可能性逐一验证,直到全部情况验证完毕。若某个情况验证符合题目条件,则为本题的一个答案;若全部情况验证完后均不符合题目条件,则问题无解,枚举的思想作为一个算法能解决许多问题。
例题一、公鸡5元一只,母鸡3元一只,小鸡1元三只。问100元买100只鸡,公鸡,母鸡,小鸡各多少只。
题目分析:设公鸡X只,母鸡Y只,小鸡Z只。
X+Y+Z=100
5X+3Y+Z/3=100
用穷举法求解,取值范围0<=X<=20、0<=Y<=33、0<=Z<=100
#include<iostream.h>
void main()
{
int x,y,z,i=1;//i是序号,x是公鸡个数。
for(x=0;x<=20;x++)
for(y=0;y<=33;y++)
{
z=100-x-y;
if(15*x+9*y+z==300)//由于整数除法运算,所以将方程式中5X+3Y+Z/3=100全部换成整数。
cout<<i++<<" "<<x<<" "<<y<<" "<<z<<endl;
}
}
递推法
从已知的初始条件出发,逐步推出题目所要求的各中间结果和最后结果的算法
例题一、求n!
n!=1*2*3*……*n
首先求1!,然后计算2*1!,则推出2!;进一步推出3!,4!, 、、、,n!
#include<iostream.h>
void main()
{
int i,n;
int fact=1;
cin>>n;
for(i=1;i<=n;i++)
fact=fact*i;
cout<<n<<"!="<<fact;
}
例题二、求数列:第1、第2个数为1、从第3个数开始每个数是前两个数之和。其数列为:1、1、2、3、5、8……..
题目分析,如何求数列的前n项和。
#include<iostream.h>
void main()
{
int f1=1,f2=1;
int n,i,f3;
cin>>n;
cout<<f1<<" "<<f2<<" ";
for(i=3;i<=n;i++)
{
f3=f1+f2;
cout<<f3<<" ";
if(i%5==0)
cout<<endl;
f1=f2;
f2=f3;
}
}
迭代法
迭代法是常用的数值计算方法,所谓迭代是指重复执行一组语句,每次执行这组语句时,都从变量的原值推出它的一个新值。
在计算领域,常遇到代数方程 f(x)=0 或微分方程的求解问题 。有很多方程很难或无法像一元二次方程的求解公式那样去求解。因此,只用数值计算方法求出近似解若近似解的误差可以估计控制,且迭代的次数也可以接受,他就是一种近似求解的方法,既可以用来求解代数方程,又可以用来求解微分方程,使一个复杂问题求解过程转为相对简单的迭代算式的重复执行过程,
例题一、利用牛顿迭代法求方程2x^3-4x^2+3x-6=0在1.5附近的解
题目分析:
牛顿迭代法称为牛顿切线法,方法是在曲线上取一个初始点A(x0,f(x0)),过点A作函数f(x)的曲线的切线与x轴交于x1,则切线的斜率为f’(x0)=f(x0)/(x0-x1),x1=x0-f(x0)/f’(x0),显然,所得的x1更接近方程的根。继续过点B(x1,f(x1))作曲线的切线,与x轴交于x2。。。。依次重复上述过程,可得迭代公式:x(k+1)=xk-f(xk)/f’(xk).
当给定根的初始值x0和允许误差&后,就可以根据以上迭代公式得到一个符合误差要求的近似实根,
具体步骤:
1、已知x0,求x1=x0-f0/f'。f(x0)=2xo^3-4x0^2+3x0-6,
f'(x0)=6x0^2-8x0+3
2、如果x0和x1之间的误差小于或者等于指定误差范围1e-5,则认为x1就是方程的根,否则继续迭代,把新求得的x1作为x0,准备用此新的x0再去求出一个新的x1.
#include<iostream.h>
#include<math.h>
void main()
{
double x0,x1=1.5;
double f0,f1;
do{
x0=x1;
f0=2*x0*x0*x0-4*x0*x0+3*x0-6;
f1=6*x0*x0-8*x0+3;//f1=f'0
x1=x0-f0/f1;
}
while(fabs(x0-x1)>1e-5);
cout<<x1;
}