C语言循环控制语句(三) |
|
www.nanhushi.com 佚名 不详 |
[例3-17]计算半径为1到15的圆的面积,仅打印出超过50的圆面积。 #include<stdio.h> main() { int r; float area; for(r=1;r<=5;r++) { area=3.141593*r*r; if(area<50.0) continue; printf("square=%f",area); } } 结果为: RUN square=50.265488 square=78.539825 同break一样,continue语句也仅仅影响该语句本身所处的循环层,而对外层循环没有影 响。 3.4.5程序应用举例 [例3-18]验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示,例如: 4=2+2 6=3+3 ...... 98=19+79 哥德巴赫猜想是世界著名的数学难题,至今未能在理论上得到证明,自从计算机出现后,人们就开始用计算机去尝试解各种各样的数学难题,包括费马大定理、四色问题、哥德巴赫猜想等,虽然计算机无法从理论上严密地证明它们,而只能在很有限的范围内对其进行检验,但也不失其意义。费马大定理已于1994年得到证明,而哥德巴赫猜想这枚数学王冠上的宝石,至今无人能及。 分析:我们先不考虑怎样判断一个数是否为素数,而从整体上对这个问题进行考虑,可 以这样做:读入一个偶数n,将它分成p和q,使n=p+q。怎样分呢?可以令p从2开始,每次加1,而令q=n-p,如果p、q均为素数,则正为所求,否则令p=p+q再试。 其基本算法如下: 1)读入大于3的偶数n。 2)P=1 3)do{ 4)p=p+1;q=n-p; 5)p是素数吗? 6)q是素数吗? 7)}whilep、q有一个不是素数。 8)输出n=p+q。 为了判明p、q是否是素数,我们设置两个标志量flag p和flag q,初始值为0,若p是素数, 令flag p=1,若q是素数,令flag q=1,于是第7步变成: 7)}while(flag p*flag q==0);
再来分析第5、第6步,怎样判断一个数是不是素数呢? 素数就是除了1和它自身外,不能被任何数整除的整数,由定义可知: 2、3、5、7、11、13、17、19等是素数; 1、4、6、8、9、10、12、14等不是素数; 要判断i是否是素数,最简单的办法是用2、3、4、⋯⋯i-1这些数依次去除i,看能否除尽, 若被其中之一除尽,则i不是素数,反之,i是素数。 但其实,没必要用那么多的数去除,实际上,用反证法很容易证明,如果小于等于i的平 方根的数都除不尽,则i必是素数。于是,上述算法中的第5步、第6步可以细化为: 第5)步p是素数吗? flag p=1; for(j=2;j<=[sqrt(p)];j++) ifp除以j的余数=0 {flag p=0; break;} 第6)步q是素数吗? flag q=1; for(j=2;j<=[sqrt(q)];j++) ifq除以j的余数=0 {flag q=0; break;} 程序如下: #include<math.h> #include<stdio.h> main() { intj,n,p,q,flag p,flag q; printf("please input n:"); scanf("%d",&n); if(((n%2)!=0)||(n<=4)) printf("inputdataerror!\n"); else { p=1; do{ p=p+1; q=n-p; flag p=1; for(j=2;j<=(int)(floor(sqrt((double)(p))));j++) { if((p%j)==0) { flag p=0; break; } } flag q=1; for(j=2;j<=(int)(floor(sqrt((double)(q))));j++) { if((q%j)==0) { flag q=0; break; } } }while(flag p*flag q==0); printf("%d=%d+%d\n,"n,p,q); } }
程序运行结果如下: RUN¿ please input n:8 8=3+5 RUN please input n:98 98=19+79 RUN please input n:9 input data error!
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: C语言循环控制语句(二) 下一篇文章: 计算机二级辅导:C语言条件控制语句(一) |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|