




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 循环结构习题解答一、 填空。【题5.1】 C【题5.2】 5*6=30 , 0 【题5.3】 k=s=0 ,aik*bkj , printf(n) 【题5.4】 17 【题5.5】 6 【题5.6】 c1!= &c2= 【题5.7】 s=s+a/b, t=a , a=a+b, b=t 【题5.8】 不确定 【题5.9】 j=i ,aj=min;【题5.10】 2 二、 选择。【题5.11】 B 【题5.12】 B【题5.13】 C【题5.14】 A【题5.15】 C 【题5.16】 A 【题5.17】 B 【题5.18】 D 三、 编程。【题5.19】 求两个正整数的最大公约数和最小公倍数。#include void main() int a,b,r,sa,sb; printf(Input two integer numbers:n); scanf(%d%d,&a,&b); sa=a;sb=b; if(ab) r=a; a=b; b=r; r=a%b; while(r!=0) a=b; b=r; r=a%b; printf(The greatest common divisor:%dn,b); printf(The lowest common multiple:%dn,sa*sb/b); getch();【题5.20】 判断输入的某个数是否为素数。若是,输出YES,否则输出NO。#include void main() int i,x,yes,a; printf(Enter integer number:); scanf(%d,&x); yes=1; i=2; a=(int)sqrt(double)x); while(yes&i=a) if(x%i=0) yes=0; i=i+1; printf(%d ,x); if(yes) printf(YESn); else printf(NOn); getch();【题5.21】 编写程序,统计某C源程序中标识符的个数解:程序的关键是如何判断标识符。由标识符定义知它由字母、数字和下划线组成且第一个字符不能是数字。inword变量记录当前字符的状态,inword=1表示当前字符在标识符内,inword=0表示当前字符不在标识符内,inquota变量记录当前字符是否在引号内(设不考虑引号嵌套的情况),本题只能由键盘输入若干行源程序。参考程序如下:#include main() int c,num,inquota=0,inword=0; num=0; while (c=getchar()!=EOF) if ( (c=)|(c=) ) if (inquota=1) inquota=0; else inquota=1; else if ( !(c=a)&(c=A)&(c=0)&(c=0)&(c=9) inword=1; /* whle */ printf(num=%dn,num); 【题5.22】设有十进制数字a,b,c,d,e,求满足下列式子:abc*e=dcba(a非0,e非0非1)的最大的abcd。#include main() int a,b,c,d,e,max=0,x,y,z;for(a=1;a=9;a+)for(b=1;b=9;b+)for(c=1;c=9;c+)for(e=1;e=9;e+)for(d=1;d=9;d+) x=a*1000+b*100+c*10+d; y=d*1000+c*100+b*10+a; z=x*e; if(z=y)&(maxx)&(a!=b)&(b!=c)&(c!=d) max=x;printf(nmax=%dn,max);【题5.23】 打印高和上底均为5的等腰空心梯形。* * * *解:注意打印位置和行数、列数的关系,每行打印字符个数比上一行多2。内容分为三部分,“*”串、空格串、“*”串。参考程序如下:#include main() int s1,s2,s3; /* 三部分起始位置 */ int n1,n2=0,n3=0; /* 三部分的长度 */ int i,j; s1=10; n1=5; s2=s1+n1; n2=0; s3=s2+n2; for (i=1;i=5;i+) for (j=1;js1;j+) putchar( ); for (j=s1;js1+n1;j+) putchar(*); for (j=s2;js2+n2;j+) putchar( ); for (j=s3;js3+n3;j+) putchar(*); putchar(n); if (i4) if (i=1) n2=n1; else n2=n2+2; s2=s1; s1=s1-1; n1=1; s3=s3+1; n3=1; else s1=s1-1; n1=n1+n2+n3+2; s2=s1+n1; n2=0; s3=s2+n2; n3=0; getch();【题5.24】 用循环结构编写程序,计算的近似值,公式如下:/4 1 1/3 + 1/5 1/7 + 直到最后一项的绝对值小于10-6为止。解:循环结构是这类近似计算常用的结构,本题在循环时需要保持一个累计结果的变量,每次计算当前项时,需要变号操作,类似本题的结束控制使用while和do_while结构比较合适。注意当前项计算值和循环控制变量的关系,参考程序如下:#include #include main() float pi,t,n; int sign=1; pi=0.0; n=1.0; t=1.0; while (fabs(t) = 1e-6) t=sign/n; pi+=t; n+=2; sign=-sign; pi=pi*4; printf(pi = %fn,pi);getch(); 【题5.25】用牛顿迭代法求下面方程在x=1.5附近的根。2x3-4x2+3x-6 = 0解:牛顿迭代法先任意设定一个与真实的根接近的值x0作为第一次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,把它作为第三次近似根如此知道足够接近真正的根xn为止。牛顿迭代公式为: x1=x0- f(x0)/f(x0) 由于第一次近似根不可能取到真实的根,循环体至少执行一次,使用do_while循环结构实现迭代较好。参考程序如下:#include #include main() double x1,x0,fd,f1; x0=1.5; do x1=x0; f1=(2*x1-4)*x1+3)*x0-6; fd=(6*x1-8)*x1+3; x0=x1-f1/fd; while(fabs(x1-x0)=1e-5); printf(The root is %lfn,x0);【题5.26】 一根长度为133米的材料,需要截成长度为19米和23米的短料,求两种短料各截多少根时,剩余的材料最少?# includevoid main()int a,b,n1,n2;float sum,temp;sum=133;for(a=1;a=133/19;a+)for(b=1;b=0)&(tempsum) sum=temp; n1=a; n2=b;printf(“%f,%f”,n1,n2);getch();【题5.27】某次大奖赛,有七个评委对参赛者打分,编写程序对一名参赛者,输入七个评委对参赛者打出的评分数,去掉一个最高分和一个最低分,输出参赛者的平均分。#includemain() int i,a8,max,min,sum=0; float aver; for(i=1;i=7;i+) printf(please input the %dth score:,i); scanf(%d,&ai); sum=sum+ai; max=a1;min=a1; for(i=2;i=7;i+) if (maxai) min=ai; aver=(sum-max-min)/5; printf(the average:%f,aver); getch();【题5.28】 一位百万富翁遇到一陌生人,陌生人找他谈一个换钱计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二天我仍给你十万元,你给我二分钱,第三天我仍给你十万元,你给我四分钱你每天给我的钱是前一天的两倍,直到满一个月(30天),百万富翁很高兴,欣然接受了这个契约。请编写一个程序计算这一个月中陌生人给了百万富翁多少钱,百万富翁给陌生人多少钱。解:设变量 s和 t(分别为long型)分别记录百万富翁给陌生人的钱和陌生人给百万富翁的钱,第一天时:s=1(以分为单位)t=100000(以元为单位)k=1;然后用for循环:2到30,其循环体是:k=2k(每天翻一倍)s=s+kt=t+100000循环体结束后将s/100,将以分为单位转换为以元为单位。#includemain() long int i,s=1,k=1,t=100000; for (i=2;i=30;i+) k=2*k; s+=k; t+=100000; printf(m give fu:%ldn,t); printf(fu give m:%ld,s/100); getch();【题5.29】 以下程序是求矩阵a,b的乘积,a为32型矩阵,b为22型矩阵。先从键盘输入矩阵a和b的各个元素值,经过运算后将结果存入矩阵c中并按矩阵形式输出。#includemain() int i,j,k,s,a32,b22,c32; printf(please input 6 numbers for array a:); for(i=0;i3;i+) for(j=0;j2;j+) scanf(%d,&aij); printf(please input 4 numbers for array b:); for(i=0;i2;i+) for(j=0;j2;j+) scanf(%d,&bij); for(i=0;i3;i+) for(j=0;j2;j+) for(k=s=0;k2;k+) s+=aik*bkj; cij=s; for(i=0;i3;i+) for(j=0;j2;j+) printf(%6d ,cij); printf(n); getch();【题5.30】 某人有5张2角和4张3角的邮票,使用这些邮票能组合出多少种不同面值的邮资。解:使用全局数组保存邮资面值。这是典型的穷举实例,2角邮票和3角邮票的穷举范围为5张和4张,参考程序如下:#include int a100;main() int i,j,k,s,n=0; for (i=0;i=5;i+) for (j=0;j0) ak=s; n+; printf(n%d kinds:,n); for (k=0;ak;k+) printf(%3d,ak);【题5.31】 设计函数,在二维数组中产生如下形式的杨辉三角形。111121133114641解:扬辉三角形各行数据规律:(1) 每行第一个和最后一个数都是1(2) 从第3行起,除第一和最后一个数外,其余的数都是上一行同列和前一列两个数的和。定义函数,将扬辉三角形的数据保存在二维数组中。参考程序如下:#include #define N 10void yanghui(int aN,int n) int i,j; for (i=0;in;i+) ai0=1; aii=1; for (i=2;in;i+) for (j=1;ji;j+) aij=ai-1j-1+ai-1j; main() int i,j,n,aNN; printf(Enter n:); scanf(%d,&n); yanghui(a,n); for (i=0;in;i+) for (j=0;j=i;j+) printf(%d ,aij); printf(n); 【题5.32】 一个盒子中放有12个球,其中3个红的,3个白的,6个黑的,从中任取8个球,球共有多少种不同的颜色搭配。解:设任取红球个数为i, 白球个数为j, 黑球个数为8-i-j, i、j、k的不同组合既是所求的颜色搭配。参考程序如下:#include main()int i,j,count=0; printf( red white black:n); for (i=0;i=3;i+) for (j=0;j=3;j+) if (8-i-j)=6)printf(%2d: %d %d %dn,+count,i,j,8-i-j);【题5.33】 求不超过1000的回文素数。解:关键点是构造回文整数和判断素数,不超过1000的回文数包括两位和三位数,这里用穷举法构造一个整数,并求出与其对应的反序数,两者相同既是回文数。参考程序如下:#include int prime(int n) int i; for (i=2;in/2;i+) if (n%i=0) return 0; return 1;main()int i,j,k,s,t; printf(Follow is output:n); for (i=0;i=9;i+) for (j=0;j=9;j+) for (k=0;k10 & s=t & prime(s) printf(%d ,s);【题5.34】 自守数是指一个数的平方的尾数等于该数自身的自然数。如:762=5776,求出以内的自守数。解:乘法运算中积是由乘数中的每一位和被乘数相乘的部分积相加后得到的,自守数考虑积的最后几位(由数字位数决定),并不是每一个部分积的每一位都会对积的后几位有影响,对积的后n几位产生影响的部分积为:第一个部分积:被乘数最后n 位 * 乘数倒数第1位第二个部分积:被乘数最后n-1位 * 乘数倒数第2位第三个部分积:被乘数最后n-2位 * 乘数倒数第3位将以上部分积的后n位求和后截取后n位就是n位数乘机的后n位。参考程序中n是所考虑的自守数的可能范围,k是n的位数,循环中为截取被乘数的系数,kk是截取部分积时的系数,m用于累计部分积的最后n位,i是截取乘数相应位时的系数:#include main()long i,k,kk,n,m; printf(Follow is output:n); for (n=0;n0;k*=10); kk=k*10; m=0; i=10; while (k0) m=(m+(n%(k*10)*(n%i- n%(i/10)%kk; k/=10; i*=10; if (n=m) printf(%ld ,n); 【题5.35】 输入自然数n,将n分解为质因子连乘的形式输出。例如,输入756,则程序显示为756=2*2*3*3*3*7。#include main() int n,k=2,first=1; printf(Input n=); scanf(%d,&n); while(k=n) if(n%k=0) if(first) printf(%d=%d,n,k); first=0; else printf(*%d,k); n/=k; else k+; printf(n); getch();【题5.36】 编写程序,输出以下图案:* * * * * * * * * * * * * * * * * * * * #includemain()int i,j,k; for (i=1;i=4;i+) for(j=1;j=20-i;j+) printf( ); for(k=1;k0;i-) for(j=1;j=20-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n);getch();【题5.37】 求Sn=a+aa+aaa+aaaa的值。例如当a=2,n=4时,Sn=2+22+222+2222。a和n由键盘输入。#includemain() int a,n,i,t=0,sn=0; printf(Enter a and n:); scanf(%d,%d,&a,&n); for(i=1;i=n;i+) t=t*10+a; sn+=t; printf(sn=%d,sn); getch();【题5.38】假定某地区1996年的人口为12.3亿人,求在人口增长率分别为2%,1.5% ,1% ,0.5%时,该地区哪一年人口达到13亿?。#includemain() float ren,r; int i; ren=12.3; printf(请输入增长率:0.02,0.015,0.01,0.005其中之一n); scanf(%f,&r); for (i=1997;ren13;i+) ren=ren*(1+r); printf(%d年,人口:%f,i,ren); getch();【题5.39】 一个数如果等于其每一个数字立方之和,则此数称为阿姆斯特朗数。如407就是一个阿姆斯特朗数,因为:407=43+03+73。要求输出100到999之间所有的阿姆斯特朗数。#includemain() int i,a,b,c; printf(The armstrong numbers betwin 100 and 999: ); for(i=100;i=999;i+) a=i/100; b=(i-a*100)/10; c=(i-a*100-b*10); if(i=a*a*a+b*b*b+c*c*c) printf(%d ,i); getch();【题5.40】 有一数字灯谜如下: A B C D -) C D C A B C ABCD均为一位非负整数,要求找出ABCD各值#includemain() int i,a,b,c,d; for(a=0;a=9;a+) for(b=0;b=9;b+) for(c=0;c=9;c+) for(d=0;d=9;d+) if(a*1000+b*100+c*10+d)-(c*100+d*10+c)=(a*100+b*10+c) printf(a=%d, b=%d, c=%d, d=%dn,a,b,c,d); getch();【题5.41】 打印九九乘法表。分析:一般二维表格可用双重循环处理,输出。若要输出九九乘法表,只需设两个循环变量i和j分别来控制行和列的输出即可。#include Stdio.hint main(void) int i,j; for(i=1;i10;i+) printf(%4d,i); printf(n -n); for(i=1;i10;i+) for(j=1;j10;j+) if(j!=9) printf(%4d,i*j); else printf(%4dn,i*j); getch();【题5.42】 计算1!+2!+3!+n!的值,n值由键盘输入。#include Stdio.hmain() int i,j,n; double m,s=0; printf(Enter n:); scanf(%d,&n); for(i=1;i=n;i+) for(j=1,m=1;j=i;j+) m*=j; s+=m; printf(result is: %g,s); getch();【题5.43】 从键盘上输入若干个学生的成绩,当成绩小于等于0时结束输入。计算出平均成绩,并输出不及格的成绩和人数。解:用输入负数表示输入结束。参考程序如下:#include main() float score200,ave,sum,x; int i,n,count; printf(Enter score:); scanf(%f,&x); n=0; sum=0.0; while (x0&n200) sum+=x; scoren+=x; scanf(%f,&x); ave=sum/n; printf(average= %fn,ave); for (count=0,i=0;in;i+) if (scorei60) printf(%fn,scorei); count+; printf(%d not passn,count);【题5.44】 下面是55的螺旋方阵,编程生成nn的螺旋方阵。1234516 171819615 242520714 2322218131211109解:本螺旋方阵的特点是顺时针排列从1开始的自然数,圈数为n/2,每一圈从左上角开始,产生的方阵数据放在nn的二维数组中,注意4个角点的下标控制和变化方向,参考程序如下:#include #define N 10void fun(int aN,int n) int i,j,k,m=1; for (i=0;i=n/2;i+) for (j=i;jn-i;j+) /*从左向右*/ aij=m+; for (j=i+1;j=i;j-)/*从右向左*/ an-1-ij=m+; for (j=n-2-i;j=i+1;j-)/*从下向上*/ aji=m+; main() int i,j,n,aNN; printf(Enter n:); scanf(%d,&n); fun(a,n); for (i=0;in;i+) for (j=0;jn;j+) printf(%4d ,aij); printf(n); getch();【题5.45】 约瑟夫环问题:编号为1,2,3, ,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。解:设整型数组a中保存n个人的密码,对应的人出列后,数组元素置0作为标志。顺时针确定下一个人的方法,可将下标加1,再对n求余。参考程序如下:#include #define N 100main() int a100; int i,j,m,n,k=0; printf(Enter n & m:); scanf(%d%d,&n,&m); printf(Enter code array :); for (i=0;in;i+) scanf(%d,&ai); printf(nOutput:n); for (i=0;in;i+) j=1; while (jm) while (ak=0) /*跳过已出列的人*/ k=(k+1)%n; j+; k=(k+1)%n; while (ak=0) /*跳过已出列的人*/k=(k+1)%n; printf(%d ,k); m=ak; ak=0; getch();【题5.46】 设N是一个四位数,它的9倍正好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。解:设整数N的千、百、十、个位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年绥化市中医医院招聘模拟试卷及1套参考答案详解
- 2025黑龙江哈尔滨市五常市万宝学校9大岗位招聘28人模拟试卷及完整答案详解一套
- 2025年甘肃交通职业技术学院招聘工作人员考前自测高频考点模拟试题及参考答案详解
- 浙江国企招聘2025浙江省低空产业发展有限公司招聘笔试历年参考题库附带答案详解
- 四川川藏工业园区发展有限责任公司公开招聘人选笔试历年参考题库附带答案详解
- 九江市赣北劳动保障事务代理所公开招聘劳务派遣工笔试历年参考题库附带答案详解
- 2025恒邦财产保险股份有限公司营业部招聘1人模拟试卷及答案详解(夺冠系列)
- 2025重庆江跳线轨道交通运营管理有限公司社会招聘笔试历年参考题库附带答案详解
- 2025重庆城市职业学院劳务派遣招聘笔试历年参考题库附带答案详解
- 2025贵州航空产业城集团股份有限公司旗下子公司贵州安立航空材料有限公司社会招聘及笔试历年参考题库附带答案详解
- 企业食品安全培训课件
- HPV科普讲堂课件
- 港口设施保安培训知识课件
- 电梯维护保养标准作业指导书
- 煤矿安全生产责任制考核制度和考核标准
- PGL喷雾干燥机性能验证报告
- 医师变更注册管理办法
- 2024年甘肃省临夏县人民医院公开招聘护理工作人员试题带答案详解
- 网络安全防护策略与加固方案报告模板
- 新产品开发流程及管理制度
- “一网统管”在城市治理协同中的障碍与解决路径研究
评论
0/150
提交评论