一、迭代法
1、迭代法求平方根
问题描述
即求一个数a 开根号的后是多少?求一个近似值。
迭代就是重复反馈的过程,目的是为了逼近所需的目标或结果。每次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
算法
先给定一个假设的平方根值,如x0=a/2;用迭代公式 x1=(x0+a/x0)/2 一直算到 |x0-x1|<deta,即可输出。计算公式如下:
代码
#include<stdio.h>
#include<math.h>
int main()
{
double a,x0,x1;
scanf("%lf %lf",&a,&x0);//x0=a/2
x1=(x0+a/x0)/2;//迭代法公式
do{
x0=x1;//上一次迭代的结果是下一次迭代的初值
x1=(x0+a/x0)/2;
}while(fabs(x1-x0)>=1e-5);//fab绝对值函数
printf("%.6f\n",x1);
return 0;
}
2、迭代法求方程的根
问题描述
求方程x3-x-1=0再区间[0,2]中的根
算法思想
采用二分法的思想。对给定范围 [x1,x2] 进行二分,寻找根所在的区间,即两个端点处函数值异号的区间。得到一个新的区间继续进行迭代,直到区间长度小于一定值。
代码
double solution(){
int x1,x2,x3;
x1=0;
x2=2;
do{
x3=(x1+x2)/2;
if((x1*x1*x1-x1-1)*(x3*x3*x3-x3-1)>0){
x3=x1;
}else{
x3=x2;
}
}while(fabs(x2-x1)>=1e-6);
cout<<x1;
}
二、100!有几个零
1、分析
一般这类题目都会蕴含某种规律或简便方法,阶乘末尾的一个零表示一个进位,则相当于乘10。而10是由2*5所得,在1-100中,可以产生10的有:0 2 4 5 6 8 结尾的数字,显然2是足够的,因为4 6 8 当中都含有2的因子,所以都可以当成2看。那么关键在于5的数量。故该问题的实质是要求除1-100含有多少个5?
2、计算过程
由特殊推广到一般的论证过程可得:
1、每隔5个会产生一个0,比如5,10,15,20,,,
2、每隔55个会多产生出一个0,比如25,50,75,100,,,
3、每隔55*5会再多产生出一个0 比如125
3、结果
1、所以100!末尾由多少个零?
100/5+100/25=24
2、1000!末尾有多少个零?
1000/5+1000/25+1000/125=249
4、举一反三
2009!末尾有多少个零?
2009/5=401
1-2009之间有401个数是5的倍数(余数省略)
401/5=80
1-2009之间有80个数是25的倍数
80/5=16
1-2009之间有16个数是125的倍数
16/5=3
1-2009之间有3个数是625的倍数
1-2009之间有0个数是3125的倍数
故:2009!末尾有401+80+16+3=500个0;