C语言新教材PPT课堂课件-4(2)-循环结构.ppt
1主要内容:主要内容:4.4.1 while 4.4.1 while 语句语句4.4.2 do-while 4.4.2 do-while 语句语句4.4.3 for 4.4.3 for 语句语句4.4.4 break4.4.4 break和和continuecontinue语句语句 4.4.5 4.4.5 循环的嵌套循环的嵌套4.4.6 4.4.6 循环结构程序设计举例循环结构程序设计举例4.4 循环结构循环结构2循环控制循环控制lC C语言提供三种循环语句:语言提供三种循环语句:while while 语句语句do-while do-while 语句语句for for 语句语句3举例:求举例:求1100之间所有整数的和之间所有整数的和i100sum=sum+i;i=i+1;真真假假sum=0,i=1 输出输出sum的值的值 sum=sum+i;i=i+1;假假真真sum=0,i=1 输出输出sum的值的值i=100当当型型循循环环直直到到型型循循环环44.4.1 用用while 语句实现当型循环语句实现当型循环格式:格式:while(while(表达式表达式)语句语句 当表达式当表达式为真为真循环体语句循环体语句表达式表达式循环体语句循环体语句真真(非非0)假假(0)当当型型循循环环注意:循环体可能一次也不被执行注意:循环体可能一次也不被执行进入循环进入循环的条件的条件5如果在如果在whilewhile语句之前对变量语句之前对变量sumsum赋初值为赋初值为1 1,是否,是否可以?程序的哪些地方应作相应的改动?可以?程序的哪些地方应作相应的改动?举例:用举例:用while语句求语句求1100之间整数和之间整数和#include void main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(1+2+3+100=%dn,sum);语句语句sum=sum+i;sum=sum+i;和和语句语句i+;i+;能否对调位置?能否对调位置?程序的哪些地方应作相应的改动?程序的哪些地方应作相应的改动?sum=0,i=1 当当i 100sum=sum+i i=i+1 输出输出sum的值的值例例4.18while语句语句6 4.4.2 用用do-while 语句实现直到型循环语句实现直到型循环格式格式:do do 语句语句 while(while(表达式表达式););表达式表达式循环体语句循环体语句真真(非非0)假假(0)继续循环继续循环的条件的条件注意:循环体至少被执行一次注意:循环体至少被执行一次 语句(循环体)语句(循环体)当当表达式为真表达式为真直直到到型型循循环环7举例:用举例:用do-while语句求语句求1-100之间整数和之间整数和 sum=0,i=1 sum=sum+i i=i+1 当当i=100 输出输出sum的值的值do-while语句语句#includevoidmain()inti,sum=0;i=1;dosum=sum+i;i+;while(i=100);printf(1+2+3+100=%dn,sum);例例4.18解二解二8 4.4.3 用用for 语句实现当型循环语句实现当型循环 格式格式:for(for(表达式表达式1 1;表达式表达式2 2;表达式表达式3 3)语句语句表达式表达式2循环体语句循环体语句真真(非非0)假假(0)求解表达式求解表达式1求解表达式求解表达式3实质是当型循环实质是当型循环进入循环进入循环的条件的条件9for语句的最常用格式语句的最常用格式在在forfor语句中,通常表达式语句中,通常表达式1 1用来为循环变量赋初值,表用来为循环变量赋初值,表达式达式2 2用来设置循环条件,表达式用来设置循环条件,表达式3 3用于循环变量增值。用于循环变量增值。for for 语句的最常用格式:语句的最常用格式:for(for(循环变量赋初值循环变量赋初值;循环条件循环条件;循环变量增值循环变量增值 )语句语句例:例:for(i=1;i=10;i+=4)printf(%d,i);输出输出 1 5 9例例4.234.23(例(例4.184.18解三):求解三):求11001100之间的整数之和之间的整数之和 sum=0;for(i=1;i=100;i+)sum=sum+i;printf(%d,i);1310for语语句句for语句的执行过程语句的执行过程输出输出:1#includevoidmain()inti;for(i=1;i=10;i+=4)printf(%d,i);printf(%d,i);5 9 1311典型算法:累加、连乘典型算法:累加、连乘累加算法之累加通式:累加算法之累加通式:累加和变量累加和变量=累加和变量累加和变量+累加项累加项如如 sum=sum+i ;(i为循环变量)为循环变量)sum=sum+x;(x为输入值或某计算结果)为输入值或某计算结果)num=num+1;即即 num+;(计数)(计数)连乘算法之连乘通式:连乘算法之连乘通式:连乘积变量连乘积变量=连乘积变量连乘积变量*连乘项连乘项如如 fac=fac*i ;(i为循环变量)为循环变量)fac=fac*x;(x为输入值或某计算结果)为输入值或某计算结果)12累加、连乘算法举例累加、连乘算法举例【例例4.24】求求n!【例例4.19】、【例例4.22】求求的近似值的近似值【例例】求若干数之总和及平均值求若干数之总和及平均值【例例4.35】多项式计算多项式计算13P98例例4.24 求求 n!=123 n#includevoidmain()inti,n;longp=1;printf(inputaninteger:n);scanf(%d,&n);for(i=1;i=n;i+)p*=i;printf(n!=%ldn,p);阶乘结果用阶乘结果用int型型可能会溢出可能会溢出也可用while语句实现(例4.20),或用do-while语句实现举例:求举例:求n!14举例:求举例:求的近似值(的近似值(1)#include#include void main()int i=1,n;double pi=0;printf(Input an integer:n);scanf(%d,&n);while(i=n)pi+=1.0/(i*i);i+;pi=sqrt(pi*6);printf(pi=%lfn,pi);/*累加和累加和pi,存存2/6*/P90P90例例4.194.19 利用以下公式求利用以下公式求的近似值(的近似值(n n由键由键盘输入,盘输入,n n值越大值越大的值越精确)的值越精确)也可用for语句或do-while语句实现15举例:求举例:求的近似值(的近似值(2)累加式累加式累加式累加式准备准备下一项下一项准备准备下一项下一项循环条件循环条件循环条件循环条件P94P94例例4.224.22利用格里高公式利用格里高公式 求求的近似值,的近似值,直到最后一项的绝对值小于直到最后一项的绝对值小于1010-6-6为止为止/*累加项累加项t,累加和累加和pi,分母分母n,符号位符号位s*/当当型型直直到到型型/*实现实现+1和和-1交替出现交替出现*/16求求的近似值(的近似值(2)#include#include void main()float pi,t,n;int s;t=1;pi=0;n=1.0;s=1;do pi=pi+t;n=n+2;s=-s;t=s/n;while(fabs(t)=1e-6);pi=pi*4;printf(pi=%10.6fn,pi);/*实现实现+1和和-1交替出现交替出现*/*累加和累加和pi,累加项累加项t*/*分母分母n,符号位符号位s*/掌握在循环体掌握在循环体中实现正负相中实现正负相间的技巧间的技巧例例4.2217举例:多项式计算举例:多项式计算#include void main()float sum,term,x;int n,k,sign;printf(Input n,x:n);scanf(%d,%f,&n,&x);sum=x;term=x;sign=1;for(k=2;k=n;k+)term*=x*x/(2*k-2)/(2*k-1);sign=-sign;sum+=sign*term;printf(sum=%fn,sum);P113P113例例4.354.35 计算计算18例:求例:求1100之间的整数之和之间的整数之和#include#include void main()void main()intint i,sum;i,sum;sum=0;sum=0;for(i=1 ;i=100;i+)for(i=1 ;i=100;i+)sum=sum+i;sum=sum+i;printf(sumprintf(sum=%=%dn,sumdn,sum););表达式表达式1 1可缺省(但可缺省(但其后的分号不能省其后的分号不能省略),将表达式略),将表达式1 1作作为语句放到循环之为语句放到循环之前。前。i=1i=1;4.4.3(2)4.4.3(2)for 语句的灵活使用语句的灵活使用19sum=0;sum=0;#include#include void main()void main()intint i,sum;i,sum;for(i=1;i=100;i+)for(i=1;i=100;i+)sum=sum+i,sum=sum+i,printf(sumprintf(sum=%=%dn,sumdn,sum););循环之前的赋初值语句循环之前的赋初值语句可以放在表达式可以放在表达式1 1中,中中,中间用逗号间隔。间用逗号间隔。例:求例:求1100之间的整数之和之间的整数之和for 语句的灵活使用语句的灵活使用 for(sum=0for(sum=0,i=1;i=100;i+i=1;i=100;i+)20#include#include void main()void main()intint i,sum;i,sum;sum=0;sum=0;for(i=1;i=100;)for(i=1;i=100;)sum=sum+i;sum=sum+i;printf(sumprintf(sum=%=%dn,sumdn,sum););表达式表达式3 3可缺省(但其可缺省(但其前的分号不能省略),前的分号不能省略),将表达式将表达式3 3作为语句放作为语句放到循环体的末尾。到循环体的末尾。i+i+for 语句的灵活使用语句的灵活使用例:求例:求1100之间的整数之和之间的整数之和 i+i+;21#include#include void main()void main()intint i,sum;i,sum;for(sum=0,i=1;i=100;i+)for(sum=0,i=1;i=100;i+)printf(sumprintf(sum=%=%dn,sumdn,sum););循环体中的内容可以放循环体中的内容可以放在表达式在表达式3 3中,但要在中,但要在圆括号的后面加一个分圆括号的后面加一个分号。号。sum=sum+i;sum=sum+i;例:求例:求1100之间的整数之和之间的整数之和for 语句的灵活使用语句的灵活使用for(sum=0,i=1;i=100;sum=sum+ifor(sum=0,i=1;i=100;sum=sum+i,i+)i+);22#include#include void main()void main()intint i,sum;i,sum;sum=0;sum=0;for(i=1 ;i=100;)for(i=1 ;i=100;)sum=sum+i;sum=sum+i;printf(sumprintf(sum=%=%dn,sumdn,sum););表达式表达式1 1、表达式、表达式3 3可同时可同时缺省,但表达式缺省,但表达式2 2前后的前后的分号都不能省略。分号都不能省略。while(i=100)while(i=100)forfor循环可替代循环可替代whilewhile循环循环例:求例:求1100之间的整数之和之间的整数之和for 语句的灵活使用语句的灵活使用i=1i=1;i+i+i+i+;23#include#include void main()void main()intint i,sum;i,sum;sum=0;sum=0;for(i=1;i+)for(i=1;i+)sum=sum+i;sum=sum+i;printf(sumprintf(sum=%=%dn,sumdn,sum););else break;/*else break;/*退出循环退出循环*/i=100i=100例:求例:求1100之间的整数之和之间的整数之和for 语句的灵活使用语句的灵活使用表达式表达式2 2可缺省,放在可缺省,放在循环体之中,但循环体之中,但forfor语语句中的两个分号都不句中的两个分号都不能省略。能省略。ifif (i=100)(i=100)此处为空相当于此处为空相当于1(永真条件)(永真条件)244.4.4 break语句和语句和continue语句语句lbreak 语句语句格式格式:break;功能功能:提前结束整个循环,从循环体中无条件提前结束整个循环,从循环体中无条件跳转到循环语句后面执行。跳转到循环语句后面执行。可用于可用于switch语句和循环结构中。语句和循环结构中。lcontinue语句语句格式格式:continue;功能功能:结束本轮循环,即在本轮循环中,不再结束本轮循环,即在本轮循环中,不再执行循环体中执行循环体中continue后面的语句。后面的语句。只能用于循环结构。只能用于循环结构。25break语句和语句和continue语句的比较语句的比较(P105举例举例)输出:输出:1 2!voidmain()intn;for(n=1;n=8;n+)if(n%3=0)break;printf(%4d,n);printf(!n);voidmain()intn;for(n=1;n=8;n+)if(n%3=0)cotinue;printf(%4d,n);printf(!n);输出:输出:1 2 4 5 7 8!26break语句的使用语句的使用算法:假设将算法:假设将512分解为分解为15i和512-15i两个数,若两个数,若512-15i能被能被13整除,整除,15i和512-15i就是一组解就是一组解#includevoidmain()inti;for(i=1;i+)if(!(512-i*15)%13)break;printf(%d+%d=512n,i*15,512-i*15);P102例例4.28 将数字将数字512表示成两个数的和,这两个数表示成两个数的和,这两个数分别为分别为15和和13的倍数,的倍数,只需找到一个解即可只需找到一个解即可。代表:代表:(512-i*15)%13=027break语句的使用语句的使用算法:假设将算法:假设将512分解为分解为i和512-i两个数,若两个数,若i能被能被15整除且整除且 512-i能被能被13整除,整除,i和512-i就是一组解就是一组解#includevoidmain()inti;for(i=1;i+)if(!(i%15)&!(512-i)%13)break;printf(%d+%d=512n,i,512-i);例例4.28 另解另解28例例4.28 改为改为找到所有的解找到所有的解 voidmain()inti;for(i=1;i512;i+)if(!(i%15)&!(512-i)%13)printf(%d+%d=512n,i,512-i);29break语句的使用语句的使用算法:假设将算法:假设将512分解为分解为i和512-i两个数,若两个数,若i能被能被15整除且整除且 512-i能被能被13整除,整除,i和512-i就是一组解就是一组解#includevoidmain()inti;for(i=1;i+)if(!(i%15)&!(512-i)%13)break;printf(%d+%d=512n,i,512-i);例例4.28 另解另解30P121习题习题4.20 输入若干个数输入若干个数(以以0结束输入结束输入),求总和,求总和并统计数的个数并统计数的个数#includevoidmain()inti;floatx,sum=0;for(i=1;i=100;i+)scanf(%f,&x);if(x=0)break;sum+=x;printf(sum=%.0f,count=%dn,sum,i);i-1)break语句的使用语句的使用31continue语句的使用语句的使用P103例例4.29 输出输出100200之间所有能够被之间所有能够被7或或9整除的数整除的数#includevoidmain()inti;for(i=100;i=200;i+)if(i%7!=0)&(i%9!=0)continue;printf(%5d,i);if(i%7=0)|(i%9=0)printf(%5d,i);等效于:等效于:32continue语句的使用语句的使用例例4.29改进输出格式改进输出格式:#includevoidmain()inti,n=0;for(i=100;i=200;i+)if(i%7!=0)&(i%9!=0)continue;printf(%5d,i);n+;if(n%5=0)printf(n);/*当当n被被5整除时换行,即一行输出整除时换行,即一行输出5个数个数*/33break语句和语句和continue语句的使用语句的使用voidmain()inti,a=0,b=0,c=0,d=0;for(i=1;i=4;i+)switch(i)case1:a=1;continue;case2:b=2;case3:c=3;break;case4:d=4;printf(%d%d%d%dn,a,b,c,d);输出:输出:1230 1230 1234 P106举例举例344.4.5 4.4.5 循环嵌套循环嵌套l一个循环体中又包含了另一个完整的循环结构,一个循环体中又包含了另一个完整的循环结构,叫做循环的嵌套。叫做循环的嵌套。l三种循环结构可以互相嵌套。三种循环结构可以互相嵌套。l循环嵌套的执行过程是:外循环执行一次,内循环嵌套的执行过程是:外循环执行一次,内循环执行一个全过程。循环执行一个全过程。35#includevoidmain()inti,n=10,j;longs=0,t;for(i=1;i=n;i+)s+=t;printf(s=%ldn,s);举例:计算举例:计算s=1!+2!+3!+s=1!+2!+3!+10!+10!P108例例4.31 双重循环实现:双重循环实现:外外循环计算累加;循环计算累加;内循环求内循环求i!t=1;for(j=1;j=i;j+)t=t*j;循循环环嵌嵌套套36#includevoidmain()inti,n=10;longs=0,t=1;for(i=1;i=n;i+)t*=i;s+=t;printf(s=%ldn,s);举例:计算举例:计算s=1!+2!+3!+s=1!+2!+3!+10!+10!另解:用单重循环实现(另解:用单重循环实现(P98例例4.25)374.4.6 4.4.6 循环结构程序设计举例循环结构程序设计举例l累加、连乘累加、连乘l特殊图形输出特殊图形输出l穷举算法:穷举算法:百钱买百鸡,百钱买百鸡,求水仙花数求水仙花数l数的分离:求水仙花数,例数的分离:求水仙花数,例4.334.33l迭代、递推:求迭代、递推:求FabonacciFabonacci数列,猴子吃桃问题数列,猴子吃桃问题,牛顿迭代法牛顿迭代法求方程根求方程根l二分法求方程根二分法求方程根l数的判别:判素数数的判别:判素数l辗转相除法求最大公约数辗转相除法求最大公约数l数的统计:求最大、最小数等数的统计:求最大、最小数等l梯形法求定积分梯形法求定积分38 举例:举例:特殊图形输出(特殊图形输出(1)#include void main()int i,j;for(i=1;i=8;i+)for(j=1;j=i;j+)printf(*);printf(n);*/*外循环控制输出图形的行数外循环控制输出图形的行数*/*内循环控制每行输出的字符内循环控制每行输出的字符*/输出输出i个个*号号输出一个换行符输出一个换行符39 举例:特殊图形输出(举例:特殊图形输出(2)#include void main()int i,j,k;for(i=1;i=8;i+)for(j=1;j=i;j+)printf();for(k=1;k=3;k+)printf(*);printf(n);*/*外循环控制输出图形的行数外循环控制输出图形的行数*/输出输出i个空格个空格输出输出3个个*号号输出一个换行符输出一个换行符40 举例:特殊图形输出(举例:特殊图形输出(3)#include void main()int i,j,k;for(i=1;i=8;i+)for(j=1;j=8-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);*/*外循环控制输出图形的行数外循环控制输出图形的行数*/输出输出(8-i)个空格个空格输出输出(2*i-1)个个*号号输出一个换行符输出一个换行符41 举例:特殊图形输出(举例:特殊图形输出(4)#include void main()int i,j,k;for(i=8;i=1;i-)for(j=1;j=8-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);*/*外循环控制输出图形的行数外循环控制输出图形的行数*/输出输出(8-i)个空格个空格输出输出(2*i-1)个个*号号输出一个换行符输出一个换行符P108例例4.3042穷举法举例:解百钱买百鸡问题穷举法举例:解百钱买百鸡问题l百钱买百鸡百钱买百鸡问题(出自问题(出自算经算经,古代数学家张丘建),古代数学家张丘建):鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何。一。百钱买百鸡,问鸡翁、母、雏各几何。变量变量cockscocks:存放公鸡数量,取值:存放公鸡数量,取值020020变量变量henshens:存放母鸡数量,取值:存放母鸡数量,取值033033变量变量chickschicks:存放小鸡数量,取值:存放小鸡数量,取值01000100满足两条件:满足两条件:cocks+hens+chicks=100(cocks+hens+chicks=100(只只)5*cocks+3*hens+chicks/3=100(5*cocks+3*hens+chicks/3=100(元元)P122习题习题4.2343百钱买百鸡百钱买百鸡程序程序1#include void main()int cocks,hens,chicks;for(cocks=0;cocks=20;cocks+)for(hens=0;hens=33;hens+)for(chicks=0;chicks=100;chicks+)if(cocks+hens+chicks=100&cocks*5+hens*3+chicks/3=100&chicks%3=0)printf(%d,%d,%dn,cocks,hens,chicks);44百钱买百鸡百钱买百鸡程序程序2#include void main()int cocks,hens,chicks;for(cocks=0;cocks=20;cocks+)for(hens=0;hens=33;hens+)chicks=100-cocks-hens;if(cocks*5+hens*3+chicks/3=100&chicks%3=0)printf(%d,%d,%dn,cocks,hens,chicks);穷举法其它应用:百马百担问题;鸡兔同穷举法其它应用:百马百担问题;鸡兔同笼问题;整钱换零钱;密码破译;猜数游笼问题;整钱换零钱;密码破译;猜数游戏;求水仙花数戏;求水仙花数45穷举法举例:求水仙花数穷举法举例:求水仙花数#includevoid main()int i,j,k,m1,m2;printf(narcissus numbers are:);for(i=1;i=9;i+)/*百位数百位数*/for(j=0;j=9;j+)/*十位数十位数*/for(k=0;k=9;k+)/*个位数个位数*/m1=i*100+j*10+k;/*m1为三个数字分别为为三个数字分别为i,j,k的三位数的三位数*/m2=i*i*i+j*j*j+k*k*k;/*m2为三个数字的立方和为三个数字的立方和*/if(m1=m2)printf(%4d,m1);/*输出满足水仙花条件的数输出满足水仙花条件的数*/printf(n);P109例例4.32 一个三一个三位数若其各位数字位数若其各位数字立方和等于该数本立方和等于该数本身,则为水仙花数,身,则为水仙花数,如:如:153=13+53+33 则则153是水仙花数。是水仙花数。46 数的分离举例:数的分离举例:for(i=100;i=999;i+)a=i的百位数的百位数b=i的十位数的十位数c=i的个位数的个位数i=a3+b3+c3YNi i是水仙花是水仙花数数求水仙花数另解求水仙花数另解47数的分离举例数的分离举例例例4.33 输入输入132767之间的整数,把这个整数显示为一之间的整数,把这个整数显示为一系列数字,每组数字间隔两个空格。系列数字,每组数字间隔两个空格。算法一:算法一:P110解法(了解)解法(了解)算法二:用数组处理算法二:用数组处理-更好!更好!48递推递推/迭代算法迭代算法利用递推(迭代)公式由前一项或前几项推算利用递推(迭代)公式由前一项或前几项推算出后一项出后一项 关键在递推(迭代)公式的构造关键在递推(迭代)公式的构造例如(例如(P101)Fabonacci数列数列(兔子数列兔子数列)各项值各项值分别为:分别为:1,1,2,3,5,8,第第1项和第项和第2项值都是项值都是1,从第,从第3项开始,每一个项开始,每一个项值都是它的相邻前项值都是它的相邻前2项的项值之和,即项的项值之和,即49P101例例4.27 循环一次求循环一次求Fabonacci数列数列的的2个数个数1x1,1x2 for i=1 to 10输出输出2个项个项x1、x2值值x1+x2 x1x2+x1 x2#include void main()int i,x1=1,x2=1;for(i=1;i=10;i+)printf(%d%d ,x1,x2);x1=x1+x2;x2=x2+x1;递推递推/迭代举例:求迭代举例:求Fabonacci数列前数列前20项值项值50求求Fabonacci数列前数列前20项值项值#include void main()int i,x1=1,x2=1;for(i=1;i=10;i+)printf(%10d%10d,x1,x2);if(i%2=0)printf(n);x1=x1+x2;x2=x1+x2;实现换行,保证每行实现换行,保证每行输出输出2组组(4个个)数据数据例例4.27 改进输出格式改进输出格式保证每个数据占保证每个数据占10列列511x1,1x2输出输出2个项个项x1、x2值值 for i=3 to 20 x1+x2 x3输出输出1个项个项fn值值x2 x1x3 x2求求Fabonacci数列前数列前20项值项值例例4.27另解:另解:循环一次求循环一次求Fabonacci数列数列的的1个数个数52求求Fabonacci数列前数列前20项值项值#include void main()int i,x1=1,x2=1,x3;printf(n%10d%10d,x1,x2);/*循环之前先输出头循环之前先输出头2项项*/if(i%4=0)printf(n);/*实现每行输出实现每行输出4个数据个数据*/for(i=3;i=20;i+)x3=x1+x2;printf(%10d,x3);x1=x2;x2=x3;printf(n);例例4.27 另另解解53递推递推/迭代迭代举例:猴子吃桃问题举例:猴子吃桃问题 P91-92P91-92例例4.214.21 猴子摘下了一堆桃子,第一天吃总数猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求第一天共有多少个桃子?剩一个,求第一天共有多少个桃子?设第设第1 11010天未吃前的桃子数分别为天未吃前的桃子数分别为X X1 1,X,X2 2,X,X1010 X Xn n=X=Xn-1n-1/2-1/2-1 X X1010=1=1迭代公式为:迭代公式为:54 猴子吃桃问题猴子吃桃问题 P91-92例例4.21#include void main()int k,x1,x2;k=1;x2=1;/*已知第已知第10天的桃子数天的桃子数*/while(k=9)x1=(x2+1)*2;/*求第求第(10-k)天天 x2=x1;的桃子数的桃子数*/k+;printf(Total number=%dn ,x1);另解:更简洁!另解:更简洁!#include void main()int k,x;x=1;/*已知第已知第10天的桃子数天的桃子数*/for(k=9;k=1;k-)x=(x+1)*2;/*求第求第k天的桃子数天的桃子数*/printf(Total number=%dn ,x);55P122习习题题4.29 用用牛牛顿顿迭迭代代法法(牛牛顿顿切切线线法法)求求方方程程x3+4x2-10=0 在在0,3之间(或之间(或1.5附近)的根附近)的根。牛顿迭代法求方程的根举例牛顿迭代法求方程的根举例设设xk是方程是方程f(x)=0的一个近似根的一个近似根导数的几何意义即切线的斜率,得出:导数的几何意义即切线的斜率,得出:56因此,因此,令令 =x3+4x2-10=(x+4)*x)*x-10 则则 =3x2+8x=(3*x+8)*x牛顿迭代法求根牛顿迭代法求根反复迭代,反复迭代,直到前后两次求出的直到前后两次求出的x的差的绝对值小于的差的绝对值小于10-5一元多项式的一元多项式的分层计算比直分层计算比直接计算减少计接计算减少计算量。算量。牛顿迭代公式牛顿迭代公式习题习题4.2957用牛顿迭代法求根用牛顿迭代法求根N-S图图 x=1.5 x0=x f=(x0+4)*x0)*x0-10 f1=(3*x0+8)*x0 x=x0-f/f1 当当|x-x0|=1e-5 输出方程的根输出方程的根x习题习题4.2958二分法求方程的根举例二分法求方程的根举例P111例例4.34 用二分法求方程用二分法求方程x3+1.1x2+0.9x-1.4=0的根的根。100200Y-100 x1x2f(x1)xf(x2)f(x)f(x)X1、x2的中点x=(x1+x2)/2059二分法求根思路二分法求根思路基本思路:取区间两端点基本思路:取区间两端点x1和和x2,(1)若)若f(x1)、f(x2)符号相反,则在(符号相反,则在(x1,x2)区间区间内有一实根;内有一实根;取(取(x1,x2)的)的中点中点x,若若f(x1)、f(x)符号相反,则实根在(符号相反,则实根在(x1,x)区间内,改设区间内,改设x2=x,区间减半;,区间减半;若若f(x1)、f(x)符号相同,则实根在(符号相同,则实根在(x,x2)区间内,改设区间内,改设x1=x,区间减半;,区间减半;如此反复,不断缩小区间,直到如此反复,不断缩小区间,直到区间很小区间很小(|x1-x2|10-6),或者,或者|f(x)|10-6,则根为,则根为x。(2)若)若f(x1)、f(x2)符号相同,则在(符号相同,则在(x1,x2)区间区间内无实根。内无实根。60二分法求根程序二分法求根程序#include#includevoid main()float x,x1,x2,y1,y2,y;do printf(Input x1,x2:n);scanf(%f,%f,&x1,&x2);y1=(x1+1.1)*x1+0.9)*x1-1.4;y2=(x2+1.1)*x2+0.9)*x2-1.4;while(y1*y2=0);/*使输入的使输入的x1、x2满足满足f(x1)*f(x2)0)x1=x;/*若若f(x)*f(x1)0,根在区间根在区间(x,x2)内内*/else x2=x;/*若若f(x)*f(x1)=1e-6);/*或或while(fabs(x1-x2)=1e-6);*/printf(A root of equation is:%8.2fn,x);例例4.34 61数的判别举例:判断整数数的判别举例:判断整数m是否为素数是否为素数l素数即为质数,如果一个整数只能被素数即为质数,如果一个整数只能被1 1或者它本或者它本身整除,这个数就称为是素数。身整除,这个数就称为是素数。l判断素数的思路是:判断素数的思路是:让让m m被被2 2m/2m/2之间所有的整数整除,如果之间所有的整数整除,如果m m能被能被2 2m/2 m/2 之中的任何一个整数整除,则之中的任何一个整数整除,则m m一定不是一定不是素数;如果在素数;如果在2 2m/2m/2之间不存在能之间不存在能被被m m整除的整整除的整数,则数,则m m是素数是素数。P114P114例例4.364.3662判断整数判断整数m是否为素数算法是否为素数算法N-S图图输入输入m的值的值 k=m/2 for i=2 to k 真真 假假 break 结束循环结束循环 真真 假假输出输出m是素数是素数输出输出m不是素不是素数数m%i=0ik或或i=k+1,或或i=k+1循环结束后根据循环结束后根据 i的值来决定的值来决定m是否是否为素数为素数63判断整数判断整数m是否为素数程序是否为素数程序#includevoidmain()intm,i,k;scanf(%d,&m);k=m/2;for(i=2;ik)printf(n%disaprimenumber.n,m);elseprintf(n%disnotaprimenumbern,m);/*可用可用 k=sqrt(m);替代,减少判断次数替代,减少判断次数*/64 for m=100 to 200 输出输出m 真真 假假 for i=2 to k k=sqrt(m)真真 假假 break 结束循环结束循环m%i=0ik举例:输出举例:输出100200之间的所有素数之间的所有素数65P115例例4.37辗转相除法求最大公约数举例辗转相除法求最大公约数举例 输入输入m、n 将将 m、n中的大数放到中的大数放到a,小数放到小数放到b r=a%b r!=0 a=b b=r r=a%b输出最大公约数输出最大公约数b输出最小公倍数输出最小公倍数:m*n/b用辗转相除法用辗转相除法(欧几里德算法欧几里德算法)求最大公约数求最大公约数#include void main()long m,n,a,b,r;printf(nPlease input 2 integers:);scanf(%ld,%ld,&m,&n);a=mn?m:n;b=m=n?m:n;r=a%b;while(r!=0)a=b;b=r;r=a%b;printf(最大公约数是最大公约数是%ldn,b);printf(最小公倍数是最小公倍数是%ldn,m*n/b);66P116例例4.38 求最大求最大数、最小数、奇数数、最小数、奇数个数、偶数个数个数、偶数个数统计问题举例:求最大数、最小数等统计问题举例:求最大数、最小数等#include void main()int i,max,min,oldn=0,even=0,x;for(i=1;imax)