省计二级C语言程序题.docx

上传人:b****2 文档编号:23221547 上传时间:2023-05-15 格式:DOCX 页数:46 大小:639.93KB
下载 相关 举报
省计二级C语言程序题.docx_第1页
第1页 / 共46页
省计二级C语言程序题.docx_第2页
第2页 / 共46页
省计二级C语言程序题.docx_第3页
第3页 / 共46页
省计二级C语言程序题.docx_第4页
第4页 / 共46页
省计二级C语言程序题.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

省计二级C语言程序题.docx

《省计二级C语言程序题.docx》由会员分享,可在线阅读,更多相关《省计二级C语言程序题.docx(46页珍藏版)》请在冰豆网上搜索。

省计二级C语言程序题.docx

省计二级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++)

for(b=61-a;b

if((a+b)%3==0)n++;

printf("%d",n);

}

数学解法:

设另两条边的长度分别为x、y,且x>y。

则由x+y>60,x+y必须是3的倍数,得:

x=32:

y=31,共1个解;

x=33:

y=30,共1个解;

x=34:

y=29,32,共2个解;

...

x=59:

y=4,7...,58,共19个解。

将上述解数相加,即得总解数。

4、正整数A、B满足:

A

求A+B取最小值时B的值。

解法一:

(1)设初始解:

A=1,B=2698,和s=A+B=2699

(2)因为A2<2698,故A<52。

对A在[2,51]上穷举,如果A为2698的约数且s

直到A穷举完毕,即得到最小值s及对应的B。

main()/*参考答案:

71*/

{ints=2699,k,B=2698;/*设B=2698时和s有最小值2699*/

for(k=1349;k>51;k--)/*51为2698开方取整*/

if(2698%k==0)

if(2698/k+k

printf("%d",B);

}

解法二:

依据数学定理:

AB为定值时,A与B越接近,A+B越小。

因为A=sqrt(2698),即B>=52。

因此可对B在[52,2698]上从左向右搜索,一旦B整除2698,即停止搜索。

main()

{intb=52;

while(2698%b)b++;

printf("%d",b);

}

也可用EXCEL求解。

如图所示。

5、求共有几组i,j,k符合算式ijk+kji=1534。

其中i,j,k均为[0,9]上的整数且i

解法一:

ijk+kji=100i+10j+k+100k+10j+i=101*i+101*k+20*j。

可对i,j,k进行穷举搜索。

main()/*参考答案:

2*/

{inti,j,k,n=0;

for(i=1;i<9;i++)

for(j=0;j<10;j++)

for(k=i+1;k<10;k++)

if(101*i+101*k+20*j==1534)n++;

printf("%d",n);

}

解法二:

直接对三位数进行穷举搜索求解。

main()

{intm,n=0;

for(m=101;m<999;m++)

if(m/100

if(m+(m%10)*100+(m/100)+(m/10%10)*10==1534)n++;

printf("%d",n);

}

数学解法

101*i+101*k+20*j=1534

=>101*(i+k)=1534-20j

=>1534-20*9≤101*(i+k)≤1534

=>14≤i+k≤15

(1)i+k=15=>j无整数解

(2)i+k=14=>j=6

而i

共两组解。

6、求[1,50]上所有整数能构成直角三角形三边的组数。

分析:

本质上是在[1,50]上求方程X2+Y2=Z2的正整数解个数。

对X、Y、Z分别进行穷举即可。

注意到(X,Y,Z)与(Y,X,Z)为相同组,故可假定X

main()/*参考答案:

20*/

{longx,y,z,n=0;

for(z=3;z<=50;z++)

for(y=2;y

for(x=1;x

if(x*x+y*y==z*z)n++;

printf("%d",n);

}

EXCEL求解:

如图所示。

操作步骤为:

(1)A列从第二行起输入数1,2,...,48,表示X的可能取值;

(2)第一行从第二列起输入3,4,...,50,表示Z的可能取值;

(3)在B2单元格输入公式如图所示。

求Z与X的平方差的平方根;

(4)选择B2单元格,向右拖其填充柄至第51列;

(5)再分别选择B2、B3等单元格,向下拖填充柄,如图效果(保证X

(6)统计整数个数,除以2即可。

【考点三】数列求项或求和问题

【解法一】利用数列通项公式求项、利用数列求和公式求和。

【解法二】利用数列相邻项的递推关系进行计算。

【易错点】

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1