正文

《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);elseprintf("%d is not a leap year",year);   2. 交换法    空杯原理:要交换a、b杯的水,要借助第三个杯cup,先把a杯的水倒入到cup中,此时a空,再把b杯的水倒入a中,此时b空,最后把cup中的水倒入b杯,这样就实现了a、b杯水的交换。 例1:按代数值由小到大次序输出两个数。 if(a>b) {cup=a;a=b;b=cup;}      例2:求三个数a,b,c由小到大顺序输出。    用交换法,算法是,使最小值赋值给a,第二小赋值给b,最大值赋值给c。    所以a 先与b 比较,如果a>b,就交换它们的值;然后a与c比较,如果a>c就互换。这两个步骤得到a最小。最后比较b和c,如果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=0;i=1;    每次循环结束前,要计算下一次i的值。    While(i<=100)    { sum=sum+i; /*sum存累加和*/      i++;  /*每一次循环结束前,要计算下一次i的值*/ }      又如:求a+aa+aaa+……+aaa…aaa(n个a)的和,其中a是一个数字,例如:    2+22+222+2222+22222(此时n=5);a和n均由键盘输入。   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是否是素数    采用如下算法:让m被2到sqrt(m)除,如果m能被2~sqrt(m)之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即sqrt(m));如果m不能被2~k(即sqrt(m))之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。   更详细请看: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; ④     计算下一个x,x=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  

阅读(2987) | 评论(0)


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

评论

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