省计二级C语言程序题.doc_第1页
省计二级C语言程序题.doc_第2页
省计二级C语言程序题.doc_第3页
省计二级C语言程序题.doc_第4页
省计二级C语言程序题.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖南省计算机二级C语言程序题汇编1、编写程序,计算050范围内有多少个数,其每位数字之积小于每位数字和。分析:一位数显然不满足条件。求解思路是:(1)k=10,n=0(k作循环变量,n统计满足条件的数据个数)(2)取k的十位数字a和个位数字b:a=k/10,b=k%10(3)如果ab50则输出n的值,程序结束。否则转(2)参考代码(n=17):main() int k,a,b,n=0; for(k=10;k=50;k+) a=k/10,b=k%10; if(a*bk/2则转(3),否则转B(k的最大因子不超过k/2)(3)如果s与k相等,则n+(4)确定下一个整数是否为完数:k+(5)如果k10000则输出n,程序结束。否则转(2)参考代码(n=4):main() int k, s,i,n=0; for(k=6;k10000;k+) s=1; /*1是因子,直接作为和的初值*/ for(i=2;i10000则输出和值s,程序结束。否则转(2)参考代码(s=3456254):main() int k,t;long s=0; for(k=1001;k10000;k+=2) t=(k/1000)*(k/100%10)*(k/10%10)*(k%10);if(t&t%60=0)s+=k; /*t非零即为逻辑真*/ printf(%ld,s); 4、有5羊4犬3鸡2兔值钱1496,有4羊2犬6鸡3兔值钱1175,有3羊1犬7鸡5兔值钱958,有2羊3犬5鸡1兔值钱861。求鸡值多少钱? 分析:这是求解方程类问题。处理的基本方法是穷举搜索。参考代码如下:(c=23)main() int a,b,c,d; for(a=1;a300;a+) for(b=1;b300;b+) for(c=1;c140;c+) d=861-2*a-3*b-5*c; if(d=0)break;if(5*a+4*b+3*c+2*d!=1496)continue;if(3*a+1*b+7*c+5*d!=958)continue; if(4*a+2*b+6*c+3*d=1175)goto RR; RR:printf(%d ,c);5、求满足下列条件的四位数ABCD的个数:是8的倍数;A+B=B+C。分析:可从最小的四位数1000开始(是8的倍数),依次搜索满足条件A+B=B+C(即A=C)的整数。搜索步长为8。参考代码如下:(n=110)main() int k,n=0; for(k=1000;k10000;k+=8) if(k/1000=k/10%10)n+; printf(%d,n);6、求100500间除5余4、除7余2的数的和。解法一:在100,500上穷举搜索。main()/*参考答案:3678 */ int k,s=0; for(k=100;k500;k+) if(k%5=4&k%7=2)s+=k; printf(%d,s); 解法二:由数学知识,满足除5余4、除7余2的最小正数为7*2+5*6-35=9。从而所有解为9+35*k,k为任意整数。main() int k,s=0; for(k=114;k500;k+=35) s+=k; printf(%d,s); 说明:7*2+5*6-35=9的构造方法-找一个数:被5除余4且为7的倍数。试7,除5余2,故7*2即可。-找一个数:被7除余2且为5的倍数。试5,除7余5,故5*6即可。-以上两个数相加,即是被5除余4、同时被7除余2的数。7*2+5*6=44-确定满足条件最小的正整数:减去5*7的倍数即可。得到9。示例:找一个最小的正整数,其除3余1、除5余2、除7余3。-找一个数:除3余1且为5和7的倍数。试35,除3余2,故35*2=70即可。-找一个数:被5除余2且为3和7的倍数。试21,除5余1,故21*2=42即可。-找一个数:除7余3且为3和5的倍数。试15,除7余1,故15*3=45即可。-以上三个数相加,得157-确定满足条件最小的正整数:减去3*5*7的倍数即可。得到52。7、课程成绩分级标准是:分数在85,100内为A、在75,85)内为B、在60,75)内为C、在0,60)内为D。编写一个函数fun(x),用于返回分数x对应的级别。分析:由表达式(x60)+(x75)+(x85)的值k可确定分数x所在区间:k=0:x在第一区间85,100,对应等级为A。k=1:x在第二区间75,85) ,对应等级为B。k=2:x在第三区间60,75) ,对应等级为C。k=3:x在第四区间0,60) ,对应等级为D。即:x在第k+1区间。对应等级为ASCII码k+65对应字符。参考代码:char fun(float x) char k; k=(x60)+(x75)+(x85)+65; return k;8、50元兑换成5元、2元或1元,共有几种兑换方法?分析:解方程问题,用穷举法。main()/*参考答案:146 */ int a,b,c,n=0; for(a=0;a=10;a+) for(b=0;b=25;b+) for(c=0;c=50;c+) if(5*a+2*b+c=50)n+; printf(%d,n);解法二:main() int a,b,c,n=0; for(a=0;a=10;a+) for(b=0;b=25;b+) c=50-5*a-2*b; if(c0)break;else n+; printf(%d,n);9、已知非等腰三角形最长边为60、周长为3的倍数、其他两边长为整数。编程计算这类三角形的个数。解法一:不等式求解问题,用穷举法搜索所有解。main()/*参考答案:271 */ int a,b,n=0; for(a=31;a60故a30*/ for(b=1;b60&(a+b)%3=0)n+; printf(%d,n); 解法二:设另两边为a、b,则:(1)a+b60 (两边之和大于第三边)(2)a!=b。可假定ab,则30a60,60-aba(3)a+b为3的倍数。因为周长为a+b+60是3的倍数。main() int a,b,n=0; for(a=31;a60;a+) for(b=61-a;ba;b+) if(a+b)%3=0)n+; printf(%d,n); 10、正整数A、B满足:AB,A*B=2698。求A+B取最小值时B的值。解法一:(1)设初始解:A=1,B=2698,和s=A+B=2699(2) 因为A22698,故A52。对A在2,51上穷举,如果A为2698的约数且s51;k-) /*51为2698开方取整*/ if(2698%k=0) if(2698/k+ks)s=k+2698/k,B=k; printf(%d ,B);解法二:依据数学定理:AB为定值时,A与B越接近,A+B越小。因为A=sqrt(2698),即B=52。因此可对B在52,2698上从左向右搜索,一旦B整除2698,即停止搜索。main() int b=52; while(2698%b) b+; printf(%d,b); 11、有一天,小猴子摘了若干个桃子。当即吃一半多一个。第二天,又吃了剩下的一半多一个。以后每天都吃剩下的一半多一个。到第10天准备吃时,发现只剩下一个桃子。问:小猴子一共摘了多少个桃子?分析:为递推类问题。可将问题转化为:设第k天吃前还剩x个桃子,则第k-1天吃前还剩2(x+1)个桃子。已知k=10时x=1;求k=1时x=?main()/*参考答案:1534 */ int x=1,k=10; while(-k)x=(x+1)*2; printf(%d,x); 12、A、B、C是三个不大于100的正整数,且ABC,130A+B+C150, 1/A2+1/B2=1/C2。求满足条件的A、B、C共有多少组?分析:为方程求解问题,仍然用穷举法求解。需要注意的是,实数存储存在误差,不能直接进行等值判断。一般采取类似if x-y0.000001then的方法。本程序根据1/A2+1/B2=1/C2,转换为整式A2B2=(A2+B2)C2后再进行比较。另外,可利用已知条件确定以下搜索范围:(1)C最小,故CBC,A+B+CA+B2BB75。对于每个C,B的搜索区间为A+1,75)(3)对搜索到的B,A的搜索区间为B+1,100)。main()/*参考答案:1 */ long a,b,c;int n=0; for(c=1;c50;c+) for(b=c+1;b75;b+) for(a=b+1;a130&a+b+c150) if(a*a+b*b)*c*c=a*a*b*b)n+; printf(%d,n);13、设今年的国民生产总值为45600亿元,若今后每年以8%的增长率增长,多少年后能实现国民生产总值翻两番? main( ) /*参考答案:19 */ float i=1;int j=0;while (i4) i*=1.08;j+;printf(%d,j);14、求最小的三位数:其每位数字互异且立方和等于该数。分析:可对数k在区间100,999上从左到右搜索求解。main()/*参考答案:153 */int k,a,b,c; for(k=100;k1000则输出和值s,程序结束。否则转(2)参考代码:(s=1113)main()int s=0,t,n;long k; for(k=2;k=1000;k+) t=1;n=k; while(n)t*=10,n/=10; if(k*k-k)%t=0)s+=k; printf(%d,s);16、统计10009999之间所有四位数的个数:它是一个完全平方数,其左两位数字之和为10,右两位数字之积为18。分析:四位完全平方数最小的是322=1024。因此,可由k2确定完全平方数,对k在区间32,100)上穷举求解。main()/*参考答案:1 */int k,x,n=0; for(k=32;k100;k+) x=k*k; if(x/1000+(x/100%10)=10)&(x/10%10)*(x%10)=18)n+; printf(%d,n);17、某正整数组成的等差数列的前四项的和是26,前四项的积是880。求其前六项的和。分析:等差数列问题处理的基本方法是穷举首项a或公差d。以下结论是解决问题的基础:(1)第n项为a+(n-1)d(2)前n项的和为na+n(n-1)d/2main()/*参考答案:57 */int a,d; for(a=1;a6;a+) /*首项搜索:4a+6d=26得a6*/for(d=1;d4;d+) /*公差搜索:4a+6d=26得d4*/ if(4*a+6*d=26) /*前四项的和为4a+6d*/if(a*(a+d)*(a+2*d)*(a+3*d)=880)goto RR; RR:printf(%d,26+2*a+9*d); /*第5、6项的和为2a+9d*/数学方法:880=2*5*8*11。得前四项为2、5、8、11。18、S=1+3+5+7+9+,求S不大于9000的最大值。分析:求和问题的基本方法有两种:方法一:求出第k项f(k)的计算公式,再对k循环求和。方法二:得到第k+1项与第k项递推关系,再对k循环求和。main()/*参考答案:8836 */ int k=1,s=0; while(s9000)s-=k-2; printf(%d,s); 数学方法:S(n)=n2。当n=94时S有最大值942=8836。main() int k=99; while(k*k9000) k-; printf(%d,k*k); 19、求共有几组i,j,k符合算式ijk+kji=1534。其中i,j,k均为0,9上的整数且ik。解法一:ijk+kji=100i+10j+k+100k+10j+i=101*i+101*k+20*j。可对i,j,k进行穷举搜索。main()/*参考答案:2 */ int i,j,k,n=0; for(i=1;i9;i+)for(j=0;j10;j+) for(k=i+1;k10;k+) if(101*i+101*k+20*j=1534)n+; printf(%d,n);解法二:直接对三位数进行穷举搜索求解。main() int m,n=0; for(m=101;m999;m+) if(m/100m%10)if(m+(m%10)*100+(m/100)+(m/10%10)*10=1534)n+;printf(%d,n);20、求取121,140上弦数的个数。如果存在整数X、Y,使得X2+Y2=Z2,则称Z为弦数。分析:可分别对X、Y、Z进行穷举搜索。由于是求Z的个数,因此,宜从Z开始搜索匹配的X、Y。main()/*参考答案:8 */ int x,y,z,n=0; for(z=121;z=140;z+) for(x=1;xz;x+) for(y=x+1;yz;y+) /*假定XY*/ if(x*x+y*y=z*z)n+;goto RR; RR:;/*搜索到X,Y后即对下一个Z进行判断*/ printf(%d,n);解法二#include math.hmain() int x,y,z,n=0; for(z=121;z=140;z+) for(x=1;xz;x+) y=sqrt(z*z-x*x); /*搜索到X,Y后即对下一个Z进行判断*/ if(y*y=z*z-x*x)n+;break; printf(%d,n);21、某些分数的分子分母都是二位正整数的真分数,如果将分子的两位数字相加作分子,分母两位数字相加作分母,得到的分数值不变。求这些分数的分子与分母的总和。分析:设分子为x,分母为y,则xy(真分数)。可先对x在区间10,99)上穷举,对每一个x,再在区间x+1,99上搜索匹配条件的y。main()/*参考答案:10134 */ int x,y,s=0; for(x=10;x99;x+) for(y=x+1;y100;y+) if(y*(x/10%10+x%10)=x*(y/10%10+y%10)s+=x+y; printf(%d,s);/*x/y=m/n即xn=ym,转化以避免分数运算带来的误差。*/22、若两个连续自然数的积减1后是素数,则称这两个自然数为友数对,该素数称友素数。求100,200上的第10个友素数对所对应的友素数。分析:只有两个正约数的正整数称为素数(质数)。判断一个整数是否为素数的常用方法是小约数穷举法:如果k在区间 2,sqr(k)上无约数,则k是素数main()/*参考答案:17291 */ int x,k,y,n=0; for(x=100;x200;x+) y=x*(x+1)-1; for(k=2;ksqrt(y)n+;if(n=10)break; printf(%d,y);也可不使用sqrt函数,如:k=2;while(k*ky) n+;if(n=10)break;23、求1,50上所有整数能构成直角三角形三边的组数。分析:本质上是在1,50上求方程X2+Y2=Z2的正整数解个数。对X、Y、Z分别进行穷举即可。注意到(X,Y,Z)与(Y,X,Z)为相同组,故可假定XY。main()/*参考答案:20 */ long x,y,z,n=0; for(z=3;z=50;z+) for(y=2;yz;y+) for(x=1;xy;x+) /*假定xy */ if(x*x+y*y=z*z)n+; printf(%d,n);24、相差为2的两个素数称为双胞胎数。问:200,1000上有多少对双胞胎数。分析:由于需要多次判断一个整数是否为素数,为简化代码,可编写一个函数isZ(x),用于判断x是否为素数。然后在主函数中通过穷举搜索求解。int isZ(int x) /*判断x是否为素数*/ int k; for(k=2;k32;k+) /*x1000,其平方根小于32*/if(x%k=0)break; return k=32;main()/*参考答案:20 */ int x,n=0; for(x=203;xB)称为自然数对。求1,100中所有这样的自然数对中B的和。1160方法一:对A、B分别进行穷举搜索求解。#include math.hmain()/*参考答案:1160 */ int a,b,x,s=0; for(a=2;a=100;a+) for(b=1;ba;b+) x=sqrt(a+b); if(x*x=a+b)x=sqrt(a-b);if(x*x=a-b)s+=b; printf(%d,s);方法二:设A+B=X2,A-B=Y2,则A=( X2+ Y2)/2,B=( X2- Y2)/2。且由A+B200可得YX15。可分别对X、Y进行穷举搜索。main() int x,y,s=0; for(x=2;x15;x+) for(y=1;yx;y+)if(x+y)%2=0) /*x,y必须同奇偶*/if(x*x+y*y=200)s+=(x*x-y*y)/2; printf(%d,s);26、斐波那契数列的前二项均为1,从第三项起,每项均为前两项的和。求10000000内最大的斐波那契数。分析:典型的递推类问题。找到第k项与前两项的关系即可利用循环求解。main()/*参考答案:9227465 */ long a=1,b=1; while(b10000000) b+=a,a=b-a; printf(%ld,a);27、X=2,求Y=X/1!-X3/3!+X5/5!-X7/7!+前20项的值。要求四舍五入精确到小数点后二位。分析:递推问题。设第k项的符号为t、分子为u、分母为v,则第k+1项的符号t=-t、分子u=u*x*x、分母v=v*2k(2k+1)main()/*参考答案:0.91 */ int t=1;double s=0,v=1,k=0,x=2; while(k+20) s+=t*x/v; t=-t;x*=4;v*=2*k*(2*k+1); printf(%.2f,s);/* printf(%.2f,s)能自动将s四舍五入;也可通过以下运算进行处理: s=(int)(s+0.005)*100);s/=100;*/28、编写函数fun(n,r)返回二进制正整数n的r进制数。1r10。分析:利用除r取余法得到r进制数的各位数字,再用十进制数的形式表示出来。long fun(long n,int r)long y=0,t=1; while(n)y+=t*(n%r);t*=10;n/=r; return y;29、50个小学生按至50序号顺时针围成一圈,做出局游戏,老师站在圈外逆时针从最后一个人数起,每数到5时,这人从圈里出来,继续数1,2,3,4,5,数到第5个学生时,他就出局,已出局的位置不再参加计数,直至所有的学生出局为止,问最后一个出局的学生序号是多少号。分析:可利

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论