【例6.11】逆序输出某个数字。
运行结果:
程序讲解:
在程序中,我们每计算出一位数字,就把它显示出来。需要提醒读者注意的是,在while循环体中的printf语句中,我们没有输出换行符,这样所有输出的数字就会显示在同一行上。我们在程序的最后使用printf 函数,该函数仅仅输出一个换行符,这样,在程序输出了所有的数字之后,光标将被移到下一行的开始。
【例6.12】输入一个大于2 的整数n,判断其是否为素数。
分析:
素数是除了1 和它本身以外,不能被其他数整除的数。
设该数为n,可以在[2,n-1]范围内逐个取数,判断该数是否能被n整除,如果都不能,则n 为素数,否则不是素数。因为一个数的因子总是成对出现,显然,如果有因子,一定有一个在n 的平方根之前(包括平方根),而另一个一定在n 的平方根之后(包括平方根)。判断一个数不是素数,只要找到一个除1 和它本身以外的因子即可,所以查找范围可缩小到n的平方根之内(包括平方根)。
在编写程序时,可用循环在2 到n 的平方根之内逐个数判断,如果找到一个因子,则提前结束循环,如果找不到因子则按循环条件正常结束循环。因为这两种方法结束循环时,循环控制变量的值不同,所以可以通过检查循环变量的值来确定程序是否正常结束循环。如果循环是正常结束,则该数为素数,否则该数不是素数。判断一个数是不是n 的因子,可用n除以该数取余,如果余数为0 则说明该数是n 的因子。
运行结果:
程序讲解:
本例程序中,for 循环在2 到n 的平方根之内逐个数判断,如果找到一个因子,则提前结束循环,如果找不到因子则按循环条件正常结束循环。如果循环是正常结束,则该数为素数,否则该数不是素数。
思考:如何找出所有三位的素数?
【例6.13】求1-1/2+1/3-1/4+1/5-1/6+…-1/100 的值。
分析:
用一个变量专门处理符号位,每处理一个数后,将符号位变量取反。注意符号位变量的初值,它必须与第1 个数的符号保持一致。
运行结果:
程序讲解:
本例程序中for 循序主要处理:当i 值为奇数时,t=1,s 与t*1.0/i 相加;当i 值为偶数时,t=-1,s 与t*1.0/i 相减。循环结束之后,输出s 的值。
【例6.14】验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示。例如:
4 = 2 + 2
6 = 3 + 3
…(www.xing528.com)
9 8 = 1 9 + 7 9
分析:
我们先不考虑怎样判断一个数是否为素数,而从整体上对这个问题进行考虑,可以这样做:读入一个偶数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)}while p、q有一个不是素数。
(8)输出n=p+q。
为了判明p、q是否是素数,我们设置两个标志量flagp和flagq,初始值为0。若p是素数,令flagp=1;若q是素数,令flagq=1。于是第7步变成:(7)}while(flagp*flagq==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)步可以细化为:
程序代码如下:
运行结果:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。