打印本文 打印本文  关闭窗口 关闭窗口  
C语言循环控制语句(三)
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 13:58:01  文章录入:杜斌  责任编辑:杜斌

[例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!
打印本文 打印本文  关闭窗口 关闭窗口