省计二级C语言程序题.docx
- 文档编号:23221547
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:46
- 大小:639.93KB
省计二级C语言程序题.docx
《省计二级C语言程序题.docx》由会员分享,可在线阅读,更多相关《省计二级C语言程序题.docx(46页珍藏版)》请在冰豆网上搜索。
省计二级C语言程序题
湖南省计算机二级C语言程序题复习指导
【重要提示】
由于湖南省二级考试所有程序题(包括:
改错题、填空题和编程题)采取计算机自动评分,而评分的标准就是你最后填写的程序的运行结果而不是代码!
因此,在不得已的情况下(有时也是更直接甚至是更简洁的办法),可利用以下方法之一解决问题!
1、直接编程。
对于改错题或填空题,如果看不懂原代码,以至无法求解,可按自己思路重写代码求解。
2、通过“TurboCforWindows实验开发环境”之“典型源程序”获得求解方法甚至是源代码。
也可通过“库函数查询”获得相关函数的帮助信息。
3、借助Windows附件中的计算器解决问题(如数制转换、开方、乘方、求和等)。
4、数学方法求解。
5、利用EXCEL求解。
一定要牢记以下基本问题的解决方法!
A.如何求整数的各位数字?
主要利用除法运算和求余运算。
如设x为四位数,则:
x/1000:
是千位数字。
(整型数据相除得到的商是整数)
x/100%10:
百位数字。
x/10%10:
十位数字。
x%10:
个位数字。
B.如何判断一个整数是否为素数(质数)?
判断整数N是否为素数的主要方法是:
若[2,sqrt(N)]上无N的因子,则N为素数。
也可将区间定为[2,N/2]或[2,N-1]。
要注意,1既不是素数,也不是合数。
在考试中,为了简便,建议将区间定为[2,N-1]。
参考代码如下:
/*判断n是否为素数:
返回1表示是,0表示否*/
intisPrime(longn)
{longk;
for(k=2;k if(n%k==0)break; return(k==n); } C.如何判断一个整数是否为完全平方数? 设K、N均long类型的变量,其中N已赋值为一个正整数,取K=sqrt(N)。 则N为完全平方数<=>K*K与N相等。 D.如何确定整数的位数? 基本方法是删除个位法: while(n)k++,n/=10; 这种方法也可用于解决: (1)整数逆序输出: while(n){printf("%d",n%10);n/=10;} (2)十进制整数化为R进制整数: whille(n) {y+=t*(n%r);/*y初值为0,t初值为1;1 t*=10; n/=r; }/*y即为R进制整数(十进制表示形式)*/ 有时也可用更简洁的方法确定整数位数。 如: 一个不超过五位数的整数x,其位数为: (x>9999)+(x>999)+(x>99)+(x>9)+1。 程序题考试操作要点示例 一、程序改错题操作要点示例 1、打开VC或TurboCforWindows开发环境,新建一个文件; 2、复制代码。 在考试系统中单击“复制代码”按钮(如右图右上角); 3、将代码粘贴到开发环境中; 4、审清题意,改正程序中的错误后,运行程序; 示例中的错误是明显的: a=n\100其意图是取四位数的前两位,但“\”不是除法运算符,改为“/”即可。 程序中是求最小的四位数,因此,程序在[1000,9999]上从小到大搜索,找到满足条件的即退出查找,输出结果。 故“continue”应当改为“break”。 5、将程序运行时的显示结果填写到考试系统“程序改错题”的“结果”输入框中,如图所示。 再单击“保存”按钮即可。 二、程序填空题操作要点示例 1、打开VC或TurboCforWindows开发环境,新建一个文件; 2、复制代码。 在考试系统中单击“复制代码”按钮(如右图右上角); 3、将代码粘贴到开发环境中; 4、审清题意,填空后,运行程序; 示例中填写代码的部分是查找n的因子i。 因此应填写: n%i==0 5、将程序运行时的显示结果填写到考试系统“程序填空题”的“结果”输入框中,如图所示。 再单击“保存”按钮即可。 三、对于程序设计题,直接在开发环境中完成程序的设计和调试,并将程序运行的结果填写在“结果”输入框中,再单击“保存”按钮即可。 当然,这一结果是你编程后得到的,还是你用数学方法或EXCEL得到的,计算机评分时不管这些,只要结果正确! 程序题主要考点 【考点一】在一定范围内求满足条件的整数个数(或求最大最小值、求和)。 【求解方法】利用循环,对指定范围内的每一个整数进行条件判断。 【易错点】 统计整数个数或求和的变量未赋初值。 一般应赋初值0。 求和时变量类型错误,造成数据溢出。 建议用于整数求和的变量均定义为long类型。 数据过大时,用double类型。 比较两个数是否相等的运算符是"=="而不是"="。 【程序示例】 1、编写程序,计算0~50范围内有多少个数,其每位数字之积小于每位数字和。 分析: 一位数显然不满足条件。 求解思路是: (1)k=10,n=0(k作循环变量,n统计满足条件的数据个数) (2)取k的十位数字a和个位数字b: a=k/10,b=k%10 (3)如果ab (4)k++ (5)如果k>50则输出n的值,程序结束。 否则转 (2) 显然,该题用数学方法也很容易得到结果。 参考代码(n=17): main() {intk,a,b,n=0; for(k=10;k<=50;k++) {a=k/10,b=k%10; if(a*b } printf("%d",n); } 借助EXCEL,求解更简单。 如下图,基本操作步骤: (1)在A1、A2单元格内分别输入10、20 (2)选择A1、A2两个单元格,向下拖动填充柄,拖到第50行时松开鼠标。 这时,A列有数据10-50。 (3)在B1单元格输入公式(取十位数字): =int(A1/10) (4)在C1单元格输入公式(取个位数字): =mod(A1,10) (5)在D1单元格输入公式: =if(B1*C1 (6)选择B1、C1和D1单元格,拖动填充柄至第50行。 (7)在E1单元格输入公式: =sum(D1: D50) (8)这时E1单元格显示数值17。 这就是问题的答案。 2、一个正整数如果等于其所有因子之和,则称该数为完数。 求10000以内完数的个数。 分析: 从数学概念上讲,如果整数a能被整数k整除,就称k为a因子,又叫约数。 但在编程应用中,因子是指正整数,且没有包括a本身,而约数可包括a本身。 例如: 从数学角度,-6,-3,-2,-1,1,2,3,6均是6的因子,也均是6的约数。 但在在编程应用中,6的因子只有1,2,3。 6的约数只有1,2,3,6。 本问题的求解思路是: (1)k=6,n=0(k作循环变量,n统计满足条件的数据个数) (2)求k的所有因子之和s: A.s=1,t=2(1是k的因子,作为和s的初值;t用于因子搜索) B.如果k%t为0,则t是k的因子,更新和值: s=s+t C.t++ D.如果t>k/2则转(3),否则转B(k的最大因子不超过k/2) (3)如果s与k相等,则n++ (4)确定下一个整数是否为完数: k++ (5)如果k>10000则输出n,程序结束。 否则转 (2) 参考代码(n=4): main() {intk,s,i,n=0; for(k=6;k<10000;k++) {s=1;/*1是因子,直接作为和的初值*/ for(i=2;i<=k/2;i++)/*求k的所有因子之和*/ if(k%i==0)s+=i; if(s==k)n++;/*k为完数时累计个数*/ } printf("%d",n); } 3、求100~500间除5余4、除7余2的数的和。 解法一: 在[100,500]上穷举搜索。 main()/*参考答案: 3678*/ {intk,s=0; for(k=100;k<500;k++) if(k%5==4&&k%7==2)s+=k; printf("%d",s); } 数学解法: ----找一个数: 被5除余4且为7的倍数。 得7*2。 ----找一个数: 被7除余2且为5的倍数。 得5*6。 ----以上两个数相加,即是被5除余4、同时被7除余2的数。 7*2+5*6=44 ----确定满足条件最小的正整数: 减去5*7倍数即可。 得到9。 所以,被5除余4、同时被7除余2的数为9+35k。 再由100<=9+35k<=500得到3<=k<=14。 从而所求和为: (9+35*3)+(9+35*4)+...+(9+35*14) =9*12+35*(3+14)*12/2=3678 示例: 找最小的正整数,其除3余1、除5余2、除7余3。 ----找一个数: 除3余1且为5和7的倍数。 得35*2=70。 ----找一个数: 被5除余2且为3和7的倍数。 得21*2=42。 ----找一个数: 除7余3且为3和5的倍数。 得15*3=45。 ----以上三个数相加,得157 ----确定满足条件的最小正整数: 减去3*5*7的倍数得到52。 所以,除3余1、除5余2、除7余3的数为52+105k。 其中最小的正整数为52。 4、A、B、C是三个不大于100的正整数,且A>B>C,130 求满足条件的A、B、C共有多少组? 分析: 实数存在存储误差,不能直接进行等值判断。 一般采取类似if(fabs(x-y)<0.000001)的方法。 本程序根据1/A2+1/B2=1/C2,转换为整式A2B2=(A2+B2)C2后再进行比较。 另外,可利用已知条件确定以下搜索范围: (1)C最小,故C<50。 C搜索区间为[0,50)。 (2)A>B>C,A+B+C<150=>A+B<150=>2B<150=>B<75。 对于每个C,B的搜索区间为[C+1,75) (3)对搜索到的B,A的搜索区间为[B+1,100)。 main()/*参考答案: 1*/ {longa,b,c;intn=0; for(c=1;c<50;c++) for(b=c+1;b<75;b++) for(a=b+1;a<100;a++) if(a+b+c>130&&a+b+c<150) if((a*a+b*b)*c*c==a*a*b*b)n++; printf("%d",n); } EXCEL解法 (1)如图,在A2以下输入A的可能值: 44-100;在B1以右输入B的可能值: 1-99; (2)在B2输入公式如图所示。 选择B2,向右拖其填充柄至最后一个数据下方。 (3)选择B2及右侧数据单元格,向下拖其填充柄至最后数据右侧。 (4)从表中查找满足条件A>B>C及130 单元格中的整数即C的值,其对应行首的值即A,对应列首的值即B。 5、求取[121,140]上弦数的个数。 如果存在整数X、Y,使得X2+Y2=Z2,则称Z为弦数。 分析: 可分别对X、Y、Z进行穷举搜索。 由于是求Z的个数,因此,宜从Z开始搜索匹配的X、Y。 main()/*参考答案: 8*/ {intx,y,z,n=0; for(z=121;z<=140;z++) {for(x=1;x for(y=x+1;y if(x*x+y*y==z*z){n++;gotoRR;} RR: ;/*搜索到X,Y后即对下一个Z进行判断*/ } printf("%d",n); } 解法二 #include"math.h" main() {intx,y,z,n=0; for(z=121;z<=140;z++) {for(x=1;x {y=sqrt(z*z-x*x); /*搜索到X,Y后即对下一个Z进行判断*/ if(y*y==z*z-x*x){n++;break;} } } printf("%d",n); } 解法三: 利用EXCEL求解。 基本操作步骤为: (1)在A列输入X的可能取值。 如下图所示。 (2)在第1行输入Z的值。 (3)在B2单元格输入公式: =sqrt(B$1*B$1-$A2*$A2) (4)选择B2单元格,向右拖动其填充柄。 (5)选择B2至U2单元格,向下拖填充柄。 (6)从第二行看起,哪列有整数,对应的Z就是弦数。 6、若两个连续自然数的积减1后是素数,则称这两个自然数为友数对,该素数称友素数。 求[100,200]上的第10个友素对所对应的友素数。 分析: 只有两个正约数的正整数称为素数(质数)。 判断一个整数是否为素数的常用方法是小约数穷举法: 如果k在区间[2,sqrt(k)]上无约数,则k是素数 #include"math.h" main()/*参考答案: 17291*/ {longx,k,y,n=0; for(x=100;x<200;x++) {y=x*(x+1)-1; for(k=2;k<=sqrt(y);k++) if(y%k==0)break; if(k>sqrt(y)){n++;if(n==10)break;} } printf("%ld",y); } 7、A+B、A-B均为平方数的两个正整数(A>B)称为自然数对。 求[1,100]中所有这样的自然数对中B的和。 方法一: 对A、B分别进行穷举搜索求解。 #include"math.h" main()/*参考答案: 1160*/ {inta,b,x,s=0; for(a=2;a<=100;a++) for(b=1;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+B<200可得Y 可分别对X、Y进行穷举搜索。 main() {intx,y,s=0; for(x=2;x<15;x++) for(y=1;y if((x+y)%2==0)/*x,y必须同奇偶*/ if(x*x+y*y<=200)s+=(x*x-y*y)/2; printf("%d",s); } EXCEL解法(以方法二的思路设计) (3)从第二行开始,在A列输入X的可能值2,3,...,14;从第二列开始,在第一行输入Y的可能值1,2,...,13。 如图所示。 (4)在B2输入如图所示的公式后,向右拖其填充柄至N2。 再选择B2至N2,向下拖填充柄至14行。 (5)删除不满足X>Y的数据;再删除正整数之外的所有数据。 得到如图效果。 (6)在C16输入公式: =sum(B3: I14) (7)这时C16中显示1160,即本问题的结果。 【考点二】方程或不等式求整数解问题。 【求解方法】利用多重循环,对各变量分别在指定范围内进行穷举搜索。 【易错点】 得到解时不能正确退出循环。 正确方法是: ⏹退出当次循环继续下轮循环时使用continue语句; ⏹结束当前循环时使用break语句; ⏹从内循环跳到外循环之外,使用goto语句。 误以“=”为比较运算符“==”。 不能正确使用逻辑运算符&&、||。 数据类型不正确。 整数求和的变量建议使用long类型。 【程序示例】 1、有5羊4犬3鸡2兔值钱1496,有4羊2犬6鸡3兔值钱1175,有3羊1犬7鸡5兔值钱958,有2羊3犬5鸡1兔值钱861。 求鸡值多少钱? 参考代码如下: (c=23) main() {inta,b,c,d; for(a=1;a<300;a++) for(b=1;b<300;b++) for(c=1;c<140;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)gotoRR; } RR: printf("%d",c); } 另外,本题也可通过解四元方程组求解。 2、50元兑换成5元、2元或1元,共有几种兑换方法? main()/*参考答案: 146*/ {inta,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() {inta,b,c,n=0; for(a=0;a<=10;a++) for(b=0;b<=25;b++) {c=50-5*a-2*b; if(c<0)break;elsen++; } printf("%d",n); } 数学解法: 转化为求方程5a+2b+c=50的非负整数解: a=0: b=0,1,...,25。 有26个解。 a=1: b=0,1,...,22。 有23个解。 a=2: b=0,1,...,20。 有21个解。 a=3: b=0,1,...,17。 有18个解。 a=4: b=0,1,...,15。 有16个解。 ... a=9: b=0,1,2。 有3个解。 a=10: b=0。 有1个解。 总解数为49+39+29+19+9+1=146 EXCEL解法 (1)从第二行开始,在A列输入2元的可能张数0-25;从第二列开始,在第一行输入五元的可能张数0-10; (2)在B2输入公式: =IF(5*C$1+2*A2<=50,1,0) (3)选择B2,向右拖其填充柄至L1;再选择B2至L2,向下拖填充柄至L27。 (4)在M1输入公式: =SUM(B2: L27) 则M1显示146,即本问题的求解结果。 3、已知非等腰三角形最长边为60、周长为3的倍数、其他两边长为整数。 编程计算这类三角形的个数。 解法一: 不等式求解问题,用穷举法搜索所有解。 main()/*参考答案: 271*/ {inta,b,n=0; for(a=31;a<60;a++)/*a为长边。 因a+b>60故a>30*/ for(b=1;b if(a+b>60&&(a+b)%3==0)n++; printf("%d",n); } 解法二: 设另两边为a、b,则: (1)a+b>60(两边之和大于第三边) (2)a! =b。 可假定a>b,则30 (3)a+b为3的倍数。 因为周长为a+b+60是3的倍数。 main() {inta,b,n=0; for(a=31;a<60;a++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 语言 程序