第五章 选择结构 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

评论