迭代算法总结

为什么80%的码农都做不了架构师?>>>   hot3.png

迭代法又称为辗转法,它是一种不断用旧的变量值递推得到新值的过程。

 

迭代法和递推法的不同:

 (1)迭代法使用while循环求解,递推法使用for循环求解。

 (2)迭代法在结束时得到一个解或一组解,递推法的循环控制变量改变一次就得到一个解,循环得到一系列的解。

 

迭代法分为精确迭代和近似迭代

精确迭代

 

① 最大公约数与最小公倍数

    辗转相除法..

②十进制转化为二进制整数

    除二取余法

③质因数的分解

  任给一个整数M,编写程序对其进行质因数分解

  分析:

(1)  如果M不等于1,则从x=2开始,让M除以x,如果不能被整除,则x是其中的一个因子,将x存入a中,并用商代替M

(2)如果M能被x整除,转步骤(1),否则x加一

(3)如果M不为1,则转步骤(1)执行,否则,算法结束。

  

#include
int main()
{
	int a[16],m,m0,x=2,i=0,j;
	printf("请输入一个待分解的因数");
	scanf("%d",&m0);
	m=m0;
	while(m!=1)
	{
		while(m%x==0)
		{
			i++;
			a[i]=x;
			m=m/x;
		}
		x=x+1;
	}
	printf("因式分解:%d=",m0);
	for(j=1;j 
   

④角谷猜想

  对于一个自然数n,如果n为偶数,则将其除以2,如果n是奇数,则将其乘以3,然后加1,按照上述运算有限次后,总可以得到自然数1.

  例如:21->64->32->16->8->4->2->1;

  代码略

 

近似迭代法

  近似迭代与精确迭代相对,它是指利用迭代算法只能得到近似的解。

 ①求一个数的平方根

已知平方根迭代公式为Xn+1=(Xn+a/Xn)/2;设X0=a/2。编写程序输入a值计算其平方根。迭代的结束条件为|Xn-1-Xn|<10的-6次方。

#include
#include
int main()
{
	double a,x0,x1;
	printf("请输入一个整数:");
    scanf("%lf",&a);
	if(a<0)
    {
    	printf("输入错误,请重新输入"); 
    }		
    else
    {
    	x0=a/2;
    	x1=(x0+a/x0)/2;
    	do{
    		x0=x1;
    		x1=(x0+a/x0)/2;
    	}while(fabs(x0-x1)>=1e-6);
    }
    printf("%lf的平方根为:%lf\n",a,x1);
    return 0;
}


②二分法

 

利用二分法求方程3*x*x*x-13x+2=0在区间[1,9]的根

二分法定义:

(1)对于在区间[a,b]上连续,且f(a)*f(b)<0,则y=f(x)在区间a,b有零点存在,求出中间值c=(a+b)/2;判断f(a)*f(b)的正负。

(2)如果f(a)*f(c)<0,令b=c。否则令a=c;

(3)如果|f(c)|>EPS(精度) 且|a-b|>EPS,则转步骤(1)执行,否则停止执行,将c作为近似值。

 

#include
#include
#define EPS 1e-6
double f(double x)
{
	return 3*x*x*x-13*x+2;
} 
int main()
{
    double a,b,c;
	printf("请输入一个区间(如:1 4):");
	scanf("%lf %lf",&a,&b);
	printf("方程的解:x=");
	if(fabs(f(a))<=EPS)
	{
		printf("%lg\n",a);
	}    
	else if(fabs(f(b))<=EPS)
	{
		printf("%lg\n",b);
	}
	else if(f(a)*f(b)>0)
	{
		printf("输入错误,请重新输入"); 
	}
	else
	{
		while(fabs(f(c))>EPS&&fabs(b-a)>EPS)
		{
			c=(a+b)/2;
			if(f(a)*f(c)<0)
			{
				b=c;
			}
			else
			{
				a=c;
			}
		}
		printf("%lg\n",c);
	}
    return 0;
}

 

 

转载于:https://my.oschina.net/lin546/blog/1539695

你可能感兴趣的:(迭代算法总结)