第五章 选择结构
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. 交换法
空杯原理:要交换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
评论