正文

《C程序设计》第五章第六章算法总结2006-04-27 20:35:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/noip/13313.html

分享到:

第五章 选择结构

1. 求闰年

   判别某一年year是否为闰年。条件是:

   能被4整除,但不能被100整除;能被400整除。

   if((year%4==0&year%100!=0)||(year%400)==0)
printf("%d is a leap year",year);
else
printf("%d is not a leap year",year);

 

2. 交换法

   空杯原理:要交换ab杯的水,要借助第三个杯cup,先把a杯的水倒入到cup中,此时a空,再把b杯的水倒入a中,此时b空,最后把cup中的水倒入b杯,这样就实现了ab杯水的交换。

1:按代数值由小到大次序输出两个数。

if(a>b) {cup=a;a=b;b=cup;}

 

   2:求三个数a,b,c由小到大顺序输出。

   用交换法,算法是,使最小值赋值给a,第二小赋值给b,最大值赋值给c

   所以a 先与b 比较,如果a>b,就交换它们的值;然后ac比较,如果a>c就互换。这两个步骤得到a最小。最后比较bc,如果b>c,就交换它们的值。

if(a>b) {cup=a;a=b;b=cup;}
if(a>c) {cup=a;a=c;c=cup;}
if(b>c) {cup=b;b=c;c=cup;}

 

/* 这样,书本上的习题“输入四个整数,要求按由大小顺序输出。”就难不倒你了。 */

 

 

第六章 循环控制

1. 累加(循环应用一)

   如书本上的例题:1+2+3+……+100

   定义两个变量:sum存累加和;i为每一次循环的加数。

   变量初始值:sum=0i=1

   每次循环结束前,要计算下一次i的值。

   While(i<=100)

   { sum=sum+i; /*sum存累加和*/

     i++;  /*每一次循环结束前,要计算下一次i的值*/

}

 

   又如:求a+aa+aaa+……+aaaaaa(na)的和,其中a是一个数字,例如:

   2+22+222+2222+22222(此时n=5);an均由键盘输入。

  int i=1,a,n,t;/* t代表a(第一次),aa(第二次),aaa,aaaa,…… */

  scanf(“%d,%d”,&a,&n);

  t=a;

  long sum;

while(i<=n)

{

 sum=sum+t;

 t=t*10+a;/*计算下一次t的值,经分析可知,a+aa+aaa+……表达式中,后一个数为前一个数乘以10再加上a的值*/

 i++;/*i 表示第几次循环*/

}

 

2.穷举(循环应用之二)

今天我们将对它作重点介绍一下。请看“穷举法初涉.doc”http://it.jkmschool.net/UploadFile/ea_2006427162136.doc

要领:①确定范围;②验证条件。

 

例:输出1~1000内所有7的倍数。

算法1(穷举法):

     范围:n: 1~1000

     条件:n%7==0

         for(n=1; n<=1000; n++)

            if(n%7==0)

               printf(“%4d”,n);

    算法2(举列法):

         for(n=7; n<=1000; n+=7)

printf(“%4d”,n);

 

例:求素数

 

例:(习题:求水仙花数)

 

3.递推(循环应用之三)

习题6.10猴子吃桃问题。

提示:

   假设第一天n个桃子;

   正推:n=n/2-1   反推:n=(n+1)*2

 

习题6.3

 

      输入n;

      s=0; a=2; t=a;

      for(i=1;i<=n;i++)

      {

         s+=t;

         t=t*10+a;    /* 递推  */

      }

      输出 s;

 

4、最大公约数、最小公倍数

用辗转相除法求;

<1> 用辗转相除法求最大公约数
算法描述:
m
n(在这里,m>n)求余为r, r不等于
0
m <- n, n <- r, 继续求余

否则 n 为最大公约数
<2>
最小公倍数 = 两个数的积 / 最大公约数

 

更详细请看:http://www8.blog.163.com/article/-01Rb-rklvAp.html

 

5、求素数

判断m是否是素数

   
采用如下算法:让m2sqrt(m)除,如果m能被2sqrt(m)之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(sqrt(m))如果m不能被2k(sqrt(m))之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2k之间任一整数整除过,因此输出“是素数”。

 

更详细请看:http://www8.blog.163.com/article/-01Rb-rkrcU2.html

 

6、牛顿迭代法求方程根

设一初值x0,然后用牛顿迭代公式 x=x0-f(x0)/f'(x0)计算出下一个x,重复不断地用刚计算出的x取代上一个x值,接着再用迭代公式计算新的x,直至两次计算出的x的差额不 超过10-6为止。
    

正确答案:-1.548910

 

程序流程分析:

     输入值x0,即迭代初值;

     用初值x0代入方程中计算此时的f(x0)f(x0),程序中用变量f描述方程的值,用fd描述方程求导之后的值;

     计算增量d=f/fd

     计算下一个xx=x0-d;

     把新产生的x替换x0,为下一次迭代做好准备;

           d的绝对值大于1e-5,则重复②③④⑤步。

 

更详细请看:http://www8.blog.163.com/article/-01Rb-rwOsqj.html

 

7、二分法求方程的根

 

A我们设f(x)是单调函数(即在(x1,x2)范围内单调升值或降值)。如果开始时选x1,x2不合适,f(x1)f(x2)同号,说明(x1,x2)间无实根,需要重选x1,x2,直到f(x1)f(x2)不同符号为止。

 

B怎样作到“舍弃”一半区间呢?

 

   1. 如果

      f(x)f(x1)不同符号(异号),则用x作为新的x2,这就舍掉了原(x,x2)这个区间。如果f(x)f(x1)同号,则用x作为新的x1,这就舍弃了原(x1,x)区间。

 

2.       再根据新的x1,x2,找中点x,重复上述步骤。

 

更详细请看:http://www8.blog.163.com/article/-01Rb-rwbebR.html

 

阅读(2941) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册