四、条件循环 五、规则数列 六、数学问题.
四、条件循环
这种题型历来为各种考试所偏爱,这也是考纲所强烈要求的。
例如:输入一批数,直到输入0为止,统计正数和负数的个数。
要求编写这样的程序,可以这样考虑:
输入一批数,这个动作重复多次,故最好使用循环来解决。但不知有多少个数
所以不好用FOR循环,可以考虑使用WHILE循环;那么这个“输入0为止”,事实上告诉我们这是循环结束的条件。哪个动作需要重复,就把哪个语句作为循环体,那么输入数据、统计个数这两个动作应放入循环体中。程序请同学们自己动手。
再例如:编程产生尾数为11的4位整数,并每行5个打印输出
因符合条件的整数只有90个,个数一定,可考虑使用循环嵌套来产生,程序如下:
for (I=1;I<=9;i++)
for(j =0;j<=9;j++)
{ x = I*1000 + j*100 + 11;
Printf(“%d”,x);n++; if(n%5==0)printf(“\n”);}
综上所述,对条件循环,我们要注重哪个是条件,哪个动作需要重复,则程序就易写。
再例如:编写程序求满足以下条件的最大的N值。
12+22+32+42+……+N2<=1000
Main(){
Int n,s;
S=n=0;
While (s<=1000)
{++n; s+=n*n;}
Printf(“n=%d\n”,n-1);}
结果为:13
例如:根据π/4=1-1/3+1/5-1/7+…………公式计算π的近似值,在求精确到10-6为止;
该程序的条件是直到某项小于10-6,并不知道有多少项求和。程序由同学自己动手完成。
课后练习:
要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,以下正确的程序段是
A.while((ch=getchar())!=′N′)
printf("%c",ch);
B.while(ch=getchar()!=′N′)
printf("%c",ch);
C.while(ch=getchar()==′N′)
printf("%c",ch);
D.while((ch=getchar())==′N′)
printf("%c",ch);
五、规则数列
就是有规律可循的一列数值,如果还知道其初值,就很容易计算出其中的任意项。
迭代法(iterate):是指重复执行一组指令,在每次执行这组指令时,都从变量的原值推出它的一个新值。
例1:裴波那契序列数的递归表示如下:
f0=0
f1=1
fn=fn-2+fn-1(n>=2)
对于任意给定的正整数x,判别其是否在裴波那契序列中。
现在要求判别一个给定的正整数x是否在裴波那契序列中,一个直观的判别方法是从f0和f1出发,不停地求后面的裴波那契序列数。每得到一个裴波那契序列数,就同这个待判别数进行比较,直到相等时输出“真”。或当得到一个裴波那契序列数大于这个待判别数时,输出“假”。
要实现这个算法,需用到循环结构。我们来分析一下这个循环结构的三个要素:
(1) 初始状态:f0=0; f1=1,x=?;
(2) 循环条件:当前求得的裴波那契序列数
< 待判别数x;
(3) 循环体:计算一个新的裴波那契序列数。
根据以上的分析,判别一个给定的正整数x是否在求裴波那契序列中的C函数如下:
main(){
int f0=0, f1=1 ,x;
Scanf(“%d”,x);
while (f1<x)
{
t=f1+f0;
f0=f1;
f1=t;
}
return (x==f1|| x==f0);
}
同样的问题有:递增的牛群,递增的兔群
例2:如:求a + aa + aaa + aaaa …… + aaaaaa……a 的值( n =20, 0<a<=9)
要求出这N个数之和,只需先一个一个推导出第二个数、第三个数……
那么相邻的两个数的关系如何?
X n+1 = X n * 10 + a
所以程序结构如下:
略:由同学们自己动手
六、数学问题
1、整数的各位数字的分离与整合
由于高职教育考试的局限性,决定了在程序的编制考核中,常常出现求某一整数的某位数字的问题,或问题中需要求某位数字。所以这类问题也是同学们必须熟练掌握的内容,尤其是其中的分离和整合算法。
①一个二位整数X,它的个位数字的十位数字是:
X % 10 …………个位数
X / 10 …………十位数
②一个三位整数X,它的个位、十位、百位数字是:
X % 10 ………… 个位数字
X / 10 % 10 ………… 十位数字
X / 100 ………… 百位数字
③一个任意整数X,它的个位、十位、百位、千位……数字是怎样求出来的,显然不能象上面那样求。但象求最后一位数一样分别求出第二位、第三位……。即采用求余整除法把一个任意整数的各位数字分离出来。
程序如下:
Scanf(“%d”,&x);
while (x!=0){
n=x % 10;
x=x/10;
printf(“该整数的各位数字是%d:”,n);
}
例如:输入整数,求它的各位数字之和
Scanf(“请输入一个整数%d”,&x);
while (x != 0){
l=x % 10;
s = s+ l;
x = x /10;}
printf(“该整数的各位数字之和为:%d”, S);
另一个问题与整数的分离相反,就是把某个数按某一规律整合出一个新数
例如:求a + aa + aaa + aaaa …… + aaaaaa……a 的值( n =20, 0<a<=9)
要求出这N个数之和,只需先一个一个推导出第二个数、第三个数……
那么相邻的两个数的关系如何?
X n+1 = X n * 10 + a
所以程序结构如下:
Scanf(“%d%d”,&n , &a);
for (I =1;i<=n;i++){
x= x * 10 +a;
s = s + x ;}
printf (“其和为:%f”; S)
2、求两个正整数的最大公约数。
【欧几里德算法】
E1.[求余数] 以n除m并令r为所得余数(0<=r<n)。
E2.[余数为0?] 若r=0, 算法结束, n即为答案。
E3.[互换] 置m←n, n←r, 并返回步骤E1。
为了使计算过程更为紧凑,也考虑到当n=0时,算法仍然有效,可将以上算法稍作改动如下:
E'1.[n为0?] 若n=0, 算法结束, m即为答案。
E'2.[求余数] 以n除m并令r为所得余数(0<=n<n)。
E'3.[互换] 置m←n, n←r, 并返回步骤E'1。
根据以上所描述的算法,我们可以用C语言写出相应的函数:
main(){
int r,m,n;
Scanf(“%d%d”,&m,&n);
while (n!=0) {
r=m%n;
m=n;
n=r; }
return m;
}
3、编程找出100~999之间的所有梅花数(也称作水仙花数:一个三位数等于它的每一位数字的立方和)
For(i=100;i<=999;i++){
N=I %10; m=i/10%10;k=i/100;
If (i= =n*n*n+m*m*m+k*k*k)printf(“%d”,i);
}
请同学们补充完整!
4、输出100以内的所有完备数(其各因子之和等于其本身的正整数)
For (n=1;n<=100;n++)
{
A=1;s=0;
While(a<n){
If(n%a= =0)s+=a; a++;}
If(s= =a)printf(“%d”,n);
}
5、找出100以内的全部同构数(同构数指一个数出现在它的平方数的右端。如5的平方是25,5是25右端的数,5是同构数。)
程序如下:
int x,k,d;
for (x=1;x<=100;x++){
k=10;
if (x>10) k=100;
d=x*x;
if (d-d/k*k==x) printf("%d %d\n", x, d);}
6、从键盘输入两自然数x,y,判断它们是否互质
基本算法是:设大数为X,小数是Y,如果X/Y为整数则两数不互质,如果X和Y能同时被2到Y/2之间的任一整数整除,则X和Y也不互质,其它情况互为质数。
Int x,y,n,t=1;
Scanf(“请输入X和Y的值:%d%d”,&x,&y);
If(x<y){x=x+y;y=x-y;x=x-y;}
If(x%y==0) t=0;
Else {n=y/2;
For (i=2;i<=n;i++)if( x%i==0 )t=0;}
If(t)printf(“yes”);
Else printf(“no”);
教案PPT下载