C语言编程竞赛训练试题参考答案Word文件下载.docx
- 文档编号:1492901
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:26
- 大小:30.52KB
C语言编程竞赛训练试题参考答案Word文件下载.docx
《C语言编程竞赛训练试题参考答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言编程竞赛训练试题参考答案Word文件下载.docx(26页珍藏版)》请在冰点文库上搜索。
if(sub[i]==0)returns;
//若已经匹配返回其位置
if((p=strchr(s+k,sub[i]))==NULL)returnNULL;
//若不含子串字符则退出
while((p[j]==sub[i]||sub[i]=='
)&
&
sub[i]&
p[j])j++,i++;
//有效字符开始匹配
if(sub[i]==0)returnp-k;
//若匹配返回其位置
elsereturnStrstr(p-k+1,sub);
//否则从其下一位置查找是否有匹配位置
}
intSearch(constchars[],constcharsub[])//在s串中查找sub子串出现次数
{
char*p,t[80],s0[80];
intn=0;
strcpy(t,s);
strcpy(s0,sub);
//备份文本,abbbcdefbcdebb*fvr?
if((p=strstr(s0,"
))!
=NULL)//含'
情况(不考虑同时含'
)
{*p=0;
returnstrstr(t,s0)!
=NULL;
}//含或不含'
情况
while((p=Strstr(t,s0))!
=NULL){n++;
strcpy(t,p+strlen(s0));
}
returnn;
intSch(constchars[],constcharsub[])
{//abcde\0defg,abcdebcd
char*p,t[80];
strcpy(t,s);
//备份文本到t
if((p=strstr(t,"
"
=NULL)//判断文本中含逗号,若有则以此分界,
{*p=0;
p++;
returnSearch(t,sub)+Sch(p,sub);
}//逗号前部分匹配次数+逗号后部分匹配次数
else{returnSearch(t,sub);
}//不含逗号直接返回匹配次数
voidmain()
intn,i;
chars[80];
char**p;
cin>
>
n;
cin.getline(s,80);
p=newchar*[n];
for(i=0;
i<
i++)
p[i]=newchar[strlen(s)+1];
strcpy(p[i],s);
//读被查找的文本
i++)cout<
<
Sch(s,p[i])<
endl;
2.平面上任取n个点,可以确定一个多边形。
在计算机中单击鼠标即可获得点的,并以此确定多边形。
现要求通过输入三个点坐标值来确定一个三角形,并求这三个点所围成的三角形的面积(若这三个点不能确定一个三角形,则输出“Noexist”)。
先输入一个整数,表示后面有几组三角形坐标值;
接着每行两个数,分别代表一个点的横坐标和纵坐标,三行一组。
输出描述:
先要输出三角形的序号,再输出面积。
00
05
22
11
14
18
5
Noexist
请在/*【*/和/*】*/之间编写程序。
注意:
不要删除或增加/*【*/和/*】*/。
/***源程序***/
/*【*/
/*】*/
①2
;
10;
10
②0;
0,;
③30;
35;
④42;
37;
⑤17;
null;
5;
求三角形面积参考答案:
stdio.h"
math.h"
doubleDis(doublex1,doubley1,doublex2,doubley2)
{returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
voidsjx()
floatx1,y1,x2,y2,x3,y3;
floata,b,c,p,s;
scanf("
%f%f%f%f%f%f"
&
x1,&
y1,&
x2,&
y2,&
x3,&
y3);
a=Dis(x1,y1,x2,y2);
b=Dis(x1,y1,x3,y3);
c=Dis(x2,y2,x3,y3);
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
if(fabs(s)<
1e-6)printf("
Noexist\n"
);
elseprintf("
%g\n"
s);
%d"
n);
for(i=1;
=n;
i++)sjx();
求四边形面积参考答案:
floatsjx(doublex1,doubley1,doublex2,doubley2,doublex3,doubley3)
returns;
voidsbx()
floatx1,y1,x2,y2,x3,y3,x4,y4,s1,s2,s3,s4;
%f%f%f%f%f%f%f%f"
y3,&
x4,&
y4);
s1=sjx(x1,y1,x2,y2,x3,y3);
s2=sjx(x1,y1,x3,y3,x4,y4);
s3=sjx(x1,y1,x2,y2,x4,y4);
s4=sjx(x2,y2,x3,y3,x4,y4);
if(fabs(s1)<
1e-6||fabs(s2)<
1e-6||fabs(s3)<
1e-6||fabs(s4)<
1e-6)
printf("
else
s1+s2<
=s3+s4?
s1+s2:
s3+s4);
i++)sbx();
3.某研究所研发了一种除草药水,但其药效会随使用次数降低。
经统计,若每次使用M剂量(M为整数),则第一次使用能除M棵草,第二次使用只能除M/2棵草,第三次使用只能除M/3棵草,…,第N次使用只能除M/N棵草。
现要统计M剂量药、使用N次共能除多少棵草。
例如,若剂量为5,使用6次,则可除草棵数为:
5/1+5/2+5/3+5/4+5/5+5/6=10
先输入若干行测试数据,每行包含两个整数MN,分别代表剂量和使用次数,直到输入00表示结束。
输出每组测试数据可除草棵数。
56
62
9
①56
doublef(longm,longn)
inti,k,j;
doubles=0;
k=sqrt(m);
=k;
i++){if(i>
n)returns;
s+=m/i;
j=k;
for(i=k-1;
i>
0;
i--)
if(j+m/i-m/(i+1)<
n){s+=i*(m/i-m/(i+1));
j+=m/i-m/(i+1);
else{s+=i*(n-j);
longm,n,i;
%d%d"
m,&
while(m&
n)
s=f(m,n);
//效率高
//for(s=0,i=1;
i++)s+=m/i;
//效率低
4.小明在处理一张图像,他把图像中的点写成(x,y,1),然后乘上矩阵
,于是图像向右、向下分别移动了20、30个像素。
接着他把图像中的每一个点(x,y,1)都乘上矩阵
,结果图像又旋转了30弧度。
小明发现了矩阵的神奇,他准备计算矩阵斜下线元素的积(如果斜下线到右边,则继续从左边的下一行的第一个元素开始)。
如
,有三条斜下线,积分别为1*4*3、3*6*7、-2*5*0。
输入的第一个数n代表矩阵的阶,接着n行,每行n个数;
接着输入另一个n矩阵的信息,直到输入0阶表示结束。
要先输出序号。
13-2
446
403
02
-14
12,72,0,
0,-2,
①3
intJZ()
intn,i,j,jj;
inta[100][100],s[100],ss=0;
for(j=0;
j<
j++)scanf("
a[i][j]);
for(j=0;
j++)
s[j]=1;
jj=j;
//jj=(jj+1)%n;
为斜线乘积,jj=(jj-1+n)%n;
为反斜线乘积
i++){s[j]*=a[i][jj];
jj=(jj+1)%n;
ss+=s[j];
%d"
s[j]);
\n"
returnss;
while(JZ());
5.小明在一次机密的场合中无意中看到自己所需要的信息。
但他只能在一张标签的空白处记下这些信息,位置不够。
于是他想了一种方法:
对连续重复的部分用数字表示。
没有连续重复的字符就不变。
如ABBBCC,表示为AB3C2。
输入的每行是一个有字母构成的字符串。
输出是压缩后的字符串。
ABBBCC
MMMN
DDDFFF
AB3C2
M3N
D3F3
参考答案(C++):
voidYS(chars[])
intn=0,i=0;
charc=s[i];
do
if(c==s[i])n++;
//相同累计个数n
else//不同输出上次字符,n>
1输出n,然后再计新字符
{cout<
c;
if(n>
1)cout<
n=1;
c=s[i];
while(s[i++]);
//比完'
\0'
后结束
cout<
i++){cin.getline(s,80);
YS(s);
6.军训中甲班n位同学已经按从低到高排好队,现有乙班m位同学(未排好序)要插入一起集训。
请编程实现将乙班同学插入甲班后使队伍仍为从低到高排好的队列。
先输入两个整数nm,分别代表甲班和乙班的人数,然后输入甲班n个同学的身高,接着输入乙班m个同学的身高;
接着输入另两个班的信息,直到输入班级人数0表示结束。
输出每组排好的m+n个身高。
53
150152158160168
159159153
24
159165
154167166163
150,152,153,158,159,159,160,168,
154,159,163,165,166,167,
①53
#include<
iostream.h>
LinkList2.h"
voidBInsA(intn,intm)
{LinkList<
int>
A;
inti,j,x;
i++){cin>
x;
A.InsElem(i,x);
}//输入表元素
for(j=1;
=m;
i++)if(A[i]>
x){A.InsElem(i,x);
n++;
break;
if(i>
n){A.InsElem(i,x);
A.DispList();
//显示表
intn,m;
n>
m;
while(n&
m){BInsA(n,m);
7.某电视台有一娱乐节目,主持人让观众猜商品的价格,若观众能在规定的时间内猜中商品的价格即可获得该商品。
例如,有一精美的水壶(假设实际价格为282元,事先观众不知道),观众只知道在市面上可能的价格范围为100到400元。
此时若观众猜的价格为300元,主持人会告诉观众“大了”;
若观众猜的价格为200元,主持人会告诉观众“小了”;
直到在规定的时间内观众猜中了商品的价格。
现请你编程模拟猜商品价格的过程,要求在最少的次数内猜中商品的价格(精确到整数)。
先输入一个整数,表示要猜商品价格的次数,然后每行输入三个整数BER,B和E表示观众估计的商品价格范围,R表示实际商品价格。
输出每种商品你所猜的价格。
100400282
12015
250,325,287,268,277,282,
10,15,
②1243728509ABabcdCeDF;
2,4,2,8,0,1,3,7,5,9,A,B,C,D,F,a,b,c,d,e,;
voidCJ(intB,intE,intR)
intm;
while(B<
E)//起<
止
{
m=(B+E)/2;
m<
'
if(R==m)break;
//猜对退出
else//实价比中间数m小,则用m-1止点,否则用m+1作起点
{if(R<
m)E=m-1;
elseB=m+1;
intn,i,B,E,R;
B>
E>
R;
CJ(B,E,R);
8.一群小朋友外出郊游,并分组做游戏。
要求每组人数一致。
现有n个小朋友,有几种分法。
输入正整数,代表小朋友的人数n,以0结束。
先要输出序号,然后输出分成几组,每组多少人,有多少种情况都要输出。
6
5能被分成5组、每组包含1人
6能被分成6组、每组包含1人
6能被分成3组、每组包含2人
6能被分成2组、每组包含3人
①5
参考答案(C):
voidWS(intx)
inti;
for(i=x;
1;
if(x%i==0)printf("
%d能被分成%d组、每组包含%d人\n"
x,i,x/i);
intx;
x);
while(x){WS(x);
9.编写程序判断算术表达式的括号(大括号、方括号、圆括号三种)是否匹配。
先输入一个整数N,表示要判断的表达式个数,然后N行表达式。
{[(3+2)f]/k}
}[(dk)f]kk}
匹配
不匹配
①1
{[(dk)f]kk}
匹配;
②1
a(d[ds{d}s]d)
③1
{[{}s]d)
不匹配;
sqStack2.h"
intMatch(char*str)
{inti=0;
charc;
sqStack<
char>
S;
while(c=str[i++])
switch(c)
{
case'
{'
:
case'
['
('
S.Push(c);
}'
if(S.GetTop()=='
)S.Pop();
elsereturn0;
]'
)'
}
returnS.Empty();
inti,n;
s;
if(Match(s))cout<
匹配"
elsecout<
不匹配"
10.编程实现过滤器功能,例如,若是整数,通过此过滤器分离出偶数和奇数,若是字母,通过此过滤器分离出大写和小写字母等。
要求分离后两部分的顺序不变。
1234567890
aABbCcDEde
2,4,6,8,0,1,3,5,7,9,A,B,C,D,E,a,b,c,d,e,
请在/*【*/和/*】*/之间的空白处填入适当语句或式子。
①1234567890aABbCcDEde;
2,4,6,8,0,1,3,5,7,9,A,B,C,D,E,a,b,c,d,e,;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编程 竞赛 训练 试题 参考答案