屠新兵
摘要:在计算机编程语言的学习过程中,我们会遇到一些特殊数的编程处理方法,包括质数、完全数、水仙花数、同构数、回文数等等。该文主要以C语言编程为例,对这些特殊数的编程方法进行探索,让大家对循环语句和分支语句有进一步的了解。
关键词:C语言;特殊数
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)28-0081-02
在计算机编程语言的学习过程中,我们会遇到一些特殊数的编程处理方法,包括质数、完全数、水仙花数、同构数、回文数等等。当我们刚听到这些名词的时候,既感到陌生,又觉得好奇,有一种立即解决问题的冲动。当我们对这些特殊数进行分析时会发现,它们中很多都可以用一种最原始的方法——穷举法来解决,有些则不一定。而穷举法是最常用的一种方法,是C语言中的一个重要知识点,在近几年江苏省的职校计算机对口单招考试中也是一个重要考点。如果掌握了其要领,实现起来就会得心应手,本文主要以C语言编程为例,对这些特殊数的编程方法进行探索,希望给参加江苏省的职校计算机对口单招考试的学生及编程爱好者带来一定的帮助。
对于这些特殊数的处理,很多都可以用穷举法来解决。我们先来了解一下,什么是穷举法。穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。下面通过几个实例,来对特殊数编程处理方法进行探索。
1质数
质数的定义:除了1和本身外,不能被其他任何自然数整除的自然数叫做质数,又叫做素数。
例:编一函数int fun(int x),判断x是否为质数。
分析:要处理好该问题,就要从定义入手,定义强调质数只能被1和本身整除,不能被其他任何自然数整除,我们就要围绕这个来进行验证,也就是说:除了1和本身以外,如果能找到其他能整除的自然数,就不是质数。本题就是典型的穷举法的例子。函数如下:
int fun(int x)
{ int i;
for(i=2;i if(x%i==0) return 0; /* 能被其他自然数整除就不是质数 */ return 1; } 拓展:仅判断一个数是否为质数,是比较简单的,实际应用中往往要找出多个质数,这就需要在循环的外面再嵌套一个循环,用于控制查找的范围,再将质数作相应的处理即可。验证哥德巴赫猜想则是两次判断质数的例子。 2 完全数 完全数的定义:如果一个数恰好等于它的所有的真因子(即除了自身以外的约数)之和,则称该数为完全数,又称完美数或完备数。(如:6=1+2+3,28=1+2+4+7+14,6和28都是完全数) 例:编一函数fun(int x),判断x是否为完全数。 分析:本题的关键就是将x以内的所有数过滤一下,从中找出真因子进行累加,最后看累加的和与原数是否相等。本题也是典型的穷举法的例子。函数如下: int fun(int x) { int i,s=1; for(i=2;i<=x/2;i++) if(x%i==0) s+=i; /* 能整除的累加 */ return s==x; } 拓展:如果需要找出多个完全数,就要确定查找的范围,在循环外再嵌套一个循环。 3水仙花数 水仙花数的定义:水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n(以3为例) 次幂之和等于它本身,又称阿姆斯特朗数。(例如: 153=1^3 + 5^3+ 3^3,153就是一个水仙花数)。 例:编一函数int fun(int x),判断x是否为水仙花数(3次幂)。 分析:本题的关键就是要找出x的每一位数y,如果x仅仅是三位数,可以分别求出百位数、十位数和个位数,用b=x/100;s=x/10%10;g=x%10;可以解决,如果不知道x的位数,可以循环求出它的最低位,再求出最低位的立方和来实现。函数如下: int fun(int x) { int i,n=x,a,s=0; while(x) {a=x%10; /* 取出最低位 */ s+=a*a*a; /* 求出最低位立方和 */ x/=10; /* x去掉最低位 */ } return s==n; /* 原数n与各位数字立方和s相等就是水仙花数 */ } 拓展:同样若要找出若干个水仙花数,就是在循环外再嵌套一个循环,用于控制查找的范围,再把水仙数作相应处理,而查找并判断的过程则是穷举法。 4同构数 同构数的定义:同构数是出现在它的平方的右边的数。(例如,6出现在其平方数36的右边,76出现在其平方数5776的右边,6与76都是同构数。) 例:编一函数fun(int x,int a[]),找出x(x<1000)以内的所有同构数,存放于a数组,返回同构数的个数。 分析:本题就是对x以内所有的数进行过滤,求出x的平方,看看是否出现在平方数的右边,同时要注意,x可能是一位数、两位数或三位数,就要分别用到%10,%100,%1000。函数如下: int fun(int x,int a[]) { int i,y,m=10,n=0; for(i=2;i { if(i>10)m=100; if(i>100)m=1000; y=x*x; if(y%m==x)a[n++]=x;} return n; } 拓展:对于同构数,要根据自身的位数来确定相应的m,即除以m取余得到的数的位数与其一致,当x的范围扩大时,m也要随之发生变化。 5回文数 回文数的定义:正读与反读都一样的数。(如:1,11,121,1221等等) 例:编一函数int fun(int x),判断x是否为回文数。 分析:要判断x是否为回文数,首先要求出x的逆序数,然后判断其逆序数是否与本身相等。函数如下: int fun(int x) { int y=0,z=x; while(x) { y=y*10+x%10; x/=10; } return y==z; } 拓展:实际应用中,需要判断多个回文数,那就需要对多个数逐一进行判断。同时,将一个非回文数,加上该数的逆序数后,就可能成为回文数。若仍然是非回文数,则重复若干次上述步骤,总能得到回文数。 以上特殊数的处理方法是中职学生在实际应用中,经常遇到的,也是近几年江苏省计算机专业对口单招考试中主要考点,主要考查学生对循环和分支语句的灵活运用。需要大家平时多注意积累,多动脑筋,记住特殊数的处理方法,并将方法灵活运用到平时的学习中去。中职学生包括广大编程爱好者要多总结,从而对循环及分支语句的使用能有进一步的了解。当然编程方法不唯一,希望大家八仙过海,各显神通。 参考文献: [1] 李秉璋.C语言程序设计与训练[M].大连:理工大学出版社,2011. [2] 孔线丽.计算机专业综合理论复习用书 [M].2版.北京:原子能出版社,2007.