C语言竞赛题目大全重点多看看题目类型Word格式文档下载.docx
《C语言竞赛题目大全重点多看看题目类型Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言竞赛题目大全重点多看看题目类型Word格式文档下载.docx(187页珍藏版)》请在冰豆网上搜索。
据说最早的密码来自于罗马的凯撒大帝。
消息加密的办法是:
对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:
消息原文中的每个字母A都分别替换成字母F)。
而你要获得消息原文,也就是要将这个过程反过来。
密码字母:
ABCDEFGHIJKLMNOPQRSTUVWXYZM
原文字母:
VWXYZABCDEFGHIJKLMNOPQRSTU
注意:
只有字母会发生替换,其他非字母的字符不变,并且消息原文的所有字母都是大写的。
输入:
最多不超过100个数据集组成,每个数据集之间不会有空行,每个数据集由3部分组成:
1.起始行:
START
2.密码消息:
由1到200个字符组成一行,表示凯撒发出的一条消息.
3.结束行:
END
在最后一个数据集之后,是另一行:
ENDOFINPUT。
每个数据集对应一行,是凯撒的原始消息。
START
NSBFW,JAJSYXTKNRUTWYFSHJFWJYMJWJXZQYTKYWNANFQHFZXJX
END
NBTZQIWFYMJWGJKNWXYNSFQNYYQJNGJWNFSANQQFLJYMFSXJHTSINSWTRJ
IFSLJWPSTBXKZQQBJQQYMFYHFJXFWNXRTWJIFSLJWTZXYMFSMJ
ENDOFINPUT
⏹SampleOutput
INWAR,EVENTSOFIMPORTANCEARETHERESULTOFTRIVIALCAUSES
IWOULDRATHERBEFIRSTINALITTLEIBERIANVILLAGETHANSECONDINROME
DANGERKNOWSFULLWELLTHATCAESARISMOREDANGEROUSTHANHE
解题思路
凯撒编码,判断字符是否是字母,并循环-5即可,记得要循环哦,非常简单的题目哦
string.h>
ctype.h>
#defineN202
charstr[N]={0};
char*p;
gets(str);
while(strcmp(str,"
ENDOFINPUT"
)!
=0)//当没遇到消息集的结尾时
{
if((strcmp(str,"
START"
=0)//当消息不是开始
&
&
(strcmp(str,"
END"
=0))//消息不是结尾
{
for(p=str;
*p!
='
\0'
;
p++)//对输入的串进行解密
if(isupper(*p))//判断是否为大写字符
*p+=*p-5<
'
A'
?
26-5:
-5;
//进行转换,考虑边界问题!
}
puts(str);
//输出字符
//接受下一行
}
第3题小孩报数问题
有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。
或者是求最后出圈人的编号等等类似问题。
第一行输入小孩的人数N(N<
=64),接下来每行输入一个小孩的名字(人名不超过15个字符)最后一行输入W,S(W<
N),用逗号"
间隔
按人名输出小孩按顺序出列的顺序,每行输出一个人名
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3
(暂空)
第4题方阵填数
iostream>
usingnamespacestd;
inta[10][10];
voidFun(intn)
{
intm=1,j,i;
for(i=0;
i<
n/2;
i++)
for(j=0;
j<
n-i;
j++)
if(a[i][j]==0)
a[i][j]=m++;
for(j=i+1;
if(a[j][n-1-i]==0)
a[j][n-1-i]=m++;
for(j=n-i-1;
j>
i;
j--)
if(a[n-i-1][j]==0)
a[n-i-1][j]=m++;
if(a[j][i]==0)
a[j][i]=m++;
if(n%2==1)
a[n/2][n/2]=m;
voidmain()
intn,i,j;
cin>
>
n;
for(inti=0;
n;
for(intj=0;
a[i][j]=0;
Fun(n);
cout<
a[i][j]<
"
endl;
第5题第五套
1.编写一个程序,让它有以下功能:
从键盘上输入一个五位数,对此整数中的五个数值进行从大到小排序,形成一个新的五位数,输出这个整数。
2.输入年、月、日,输出该日期是该年的第几天。
3.将学生的学号和成绩存储在数组中,利用循环计算出数组中存储学生的平均成绩,找出高于平均分的学生信息并输出。
4.输入五个国家的名字,按字母顺序(即按ASCII码从小到大的顺序)排列输出。
5.用指针实现:
任意输入20个数,将它们按照从大到小的顺序输出。
6.编写一个简单的通讯录管理系统。
通讯录包括:
姓名、通讯地址、邮编、联系电话,现编写一个通讯录管理系统,可以对通讯录进行输入、显示、查找,通讯录保存到一个文件中。
第6题进制转换问题
1.问题描述
实现将N进制到M进制数的转换(1<
N,M<
=36)。
对于11到36进制数,其基数使用从A到Z的英文字母(全部为大写)代替。
例如对于11进制,其基数10(十进制)使用"
A"
表示;
对于36进制,其基数35(十进制)使用"
Z"
表示。
被转换的数全部为正数且小于2147483647(long型的最大值)。
下表为十进制数100对应的各进制数:
进制
10
11
16
27
35
数值
100
91
64
3J
2U
2.要求:
(1).实现10进制数到M进制数的转换。
(2).程序具有较强的容错能力(例如对错误的输入数字串的处理)。
(3).N进制到M进制数(1<
36)的转换(扩展要求,选做)。
3.输入:
输入文件名为convert.in,文件内容格式为第一列为被转换数的进制数,第二列为被转换数,第三列为转换后的进制。
这三列内容均为字符串形式。
每列之间使用一个空格隔开。
4.输出:
输出文件名为convert.out,文件内容为转换后的数。
对于一切错误,则输出“error”字符串。
5.输入输出文件样例:
样例1
convert.in
convert.out
1010027
样例2
314027
error
voidten_to_m(charout[],longintdata,intM);
intjudge(intN,longintdata);
voidconvert(charout[],intN,longintdata,intM);
intmain()
intN;
//N进制
intM;
//M进制
longintdata;
//N进制数
charout[100];
//存放M进制数
/*打开convert.in这个文件,从文件中读取用到的数据*/
FILE*fp=fopen("
/home/student/convert.in"
"
r"
);
if(fp!
=NULL)
fscanf(fp,"
%d%ld%d"
N,&
data,&
M);
fclose(fp);
fp=NULL;
}
/*判断数据data有没有错,如果没错则转换为M进制,如果错则把error
写入out中*/
if(judge(N,data)==1)
convert(out,N,data,M);
else
strcpy(out,"
error"
%s\n"
out);
/*把得到的结果写入convert.out文件中去*/
FILE*fw=fopen("
/home/student/convert.out"
w"
if(fw!
fprintf(fw,"
fclose(fw);
fw=NULL;
/*判断data有没有错,先把data转换为字符串,然后再进行判断*/
intjudge(intN,longintdata)
charb[100];
//data转换后放入b中
ten_to_m(b,data,10);
//相当于itoa
char*s=b;
while(*s!
='
)
if((*s-'
0'
)>
=N)
s++;
return1;
/*N进制转为M进制,先把N进制转为十进制,再把十进制转为M进制*/
voidconvert(charout[],intN,longintdata,intM)
inta=n_to_ten(N,data);
ten_to_m(out,a,M);
/*十进制转为M进制,当M=10时此函数相当于itoa*/
voidten_to_m(charout[],longintdata,intM)
inti=0;
inttmp=data;
intlen;
chart;
/*把data转为字符倒序的放入字符数组out中去*/
while(tmp!
=0)
if(tmp%M>
=10)
out[i]=tmp%M-10+'
else
out[i]=tmp%M+'
tmp=tmp/M;
i++;
len=i;
/*把字符数组out反序*/
for(i=0;
i<
len/2;
t=out[i];
out[i]=out[len-i-1];
out[len-i-1]=t;
out[len]='
/*N进制转为十进制*/
intn_to_ten(intN,longintdata)
chara[100];
inti;
ten_to_m(a,data,10);
//把data转为字符串
intlen=strlen(a);
intout=0;
len;
out=out*N+a[i]-'
returnout;
第7题综合应用
1.矩阵应用
给定一个整数N,生成一个N*N的矩阵,矩阵中元素取值为1至N2,1在左上角,其余各数按顺时针方向旋转前进,依次递增放置。
例如,当N=4时,矩阵中的内容如下:
1234
1213145
1116156
10987
给定n(3&
pound;
n&
50000)个闭区间[ai,bi](1&
i&
n,ai,bi均为非负整数),将这些区间合并为不相交的闭区间。
输入文件的第一行包含一个整数n,为区间的数目。
以下有n行,每行各包括两个空格分隔的整数ai和bi,表示一个区间[ai,bi](0&
ai&
bi&
1000000)。
计算结果写在标准输出上,各区间按照升序排列输出。
每一行包含两个用空格分开的整数,分别描述一个区间的上下界。
例如,对于下列输入数据:
56
14
1010
69
810
输出为:
510
2.字符串处理
从标准输入中读入N(1<
N<
10000)行以换行符结束且长度不超过2048的字符串,并在输入结束后输出其中最长10行的输入序号、长度和内容。
当有多行长度相等的最长行时,输出最先输入的行的信息。
参考【例2-7】的讨论,分别使用不同的方法实现这一程序,比较各种方法的运行效率。
3.汉诺塔问题
写出程序求解Hanoi双塔问题。
从标准输入上读入正整数n(n<
12),在标准输出上输出盘子的移动动作。
盘子的尺寸由1到n,输出数据格式为:
move<
盘子编号>
from<
原位置>
to<
新位置>
其中<
为<
d>
a或<
b,其中<
是一个小于等于n的正整数,在初始状态下尺寸相同的盘子中a盘在b盘之上,<
和<
均为字母ABC中的一个。
例如,移动序列的第一个动作可能是move1afromAtoC。
4.表达式问题
从标准输入上读入一个由数字和四则运算符组成的后缀表达式,将其转换为中缀表达式。
后缀表达式中的运算符不超过15个,数字可以是整数,也可以是带有小数部分的浮点数,数字和运算符之间由空格分隔。
转换后的中缀表达式中不应出现不必要的括号和空格,且转换前后各运算数的出现顺序不变。
例如,对于后缀表达式:
47-2.15+*7.19-/
输出
(4-7)*(2.1+5)/(7.1-9)
有大、中、小三个酒桶,分别能装A斤、B斤和C斤酒,其中A、B、C均为整数,A=B+C,B>
C>
0,且A为偶数。
现在大桶装满了酒,另外两个桶都空着。
写程序求解用这三个桶将酒平分成为两份的操作序列。
当无解时输出字符串“No”。
5.文件处理
读入一个不超过20000000个字符的正文文件,统计其中所有由字母组成的单词及其所在的行号。
文件中各个单词之间以空白符或标点分隔,区分大小写。
按单词的字典序在标准输出上输出统计结果,输出格式为<
word>
:
<
h1>
h2>
…<
hn>
,每个单词一行,其中<
是单词,<
是行号。
行号之间由空格分隔,按升序排列,不得重复,即当一个单词在一行出现多次时,只输出该行号一次。
6.路径处理
写一个程序,列出环境变量PATH中包含的所有目录的路径名。
注意,Unix/Linux上PATH中各个路径名之间的分隔符与Windows上的不同。
使用条件编译,使你的程序可以适用于这两种系统
第8题第八套
1.XX语言翻译机
XX的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套独特的缩略语。
他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。
为了让新员工可以更快地适应XX的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。
输入要求:
输入数据包含三部分:
1.第一行包含一个整数N(N<
=10000),表示总共有多少个缩略语的词条;
2.紧接着有N行的输入,每行包含两个字符串,以空格隔开。
第一个字符串为缩略语(仅包含大写英文字符,长度不超过10字节),第二个字符串为日常语言(不包含空格,长度不超过255字节);
3.从第N+2开始到输入结束为包含缩略语的相关文档(总长度不超过1000000个字节)。
例:
6
PS门户搜索部
NLP自然语言处理
PM产品市场部
HR人力资源部
PMD产品推广部
MD市场发展部
XX的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。
样例:
in.txt
输出要求:
输出将缩略语转换成日常语言后的文档。
(将缩略语转换成日常语言,其他字符保留原样)。
XX的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。
out.txt
2.饭团的烦恼
“午餐饭团”是XX内部参与人数最多的民间组织。
同一个部门的、同一所大学的、同一年出生的、使用同一种型号电脑的员工们总是以各种理由组织各种长期的、临时的饭团。
参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们增进感情。
但是,随着XX的员工越来越多,各个饭团的管理变得繁杂起来。
特别是为了照顾员工们越来越挑剔的胃,饭团的点菜负责人的压力也越来越大。
现在,这个任务就交给“XX之星”了,因为,你将要为所有的XX饭团设计一个自动点菜的算法。
饭团点菜的需求如下:
1.经济是我们要考虑的一个因素,既要充分利用XX员工的午餐补助,又不能铺张浪费。
因此,我们希望最后的人均费用越接近12元越好。
2.菜式丰富是我们要考虑的另一个因素。
为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。
3.请谨记,XX饭团在各大餐馆享受8折优惠。
1.输入数据第一行包含三个整数N,M,K(0<
=16,0<
M<
=N,0<
K<
=12),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数;
2.紧接着N行,每行的格式如下:
菜名(长度不超过20个字符)价格(原价,整数)是否荤菜(1表示是,0表示否)是否辛辣(1表示是,0表示否);
3.第N+2行是abcd四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。
322
水煮鱼3011
口水鸡1811
清炖豆腐1200
1111
对于每组测试数据,输出数据包含M+1行,前M行每行包含一个菜名(按菜名在原菜单的顺序排序)。
第M+1行是人均消费,结果保留两位小数。
口水鸡
清炖豆腐
12.00
第9题比赛规则
为了促进各部门员工的交流,XX举办了一场全公司范围内的“拳皇”(XX内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是XX的超级“拳皇”迷W.Z。
W.Z不想用传统的淘汰赛或者循环赛的方式,而是自己制定了一个比赛规则。
由于一些员工(比如同部门或者相邻部门员工)平时接触的机会比较多,为了促进不同部门之间的交流,W.Z希望员工自由分组。
不同组之间的每两个人都会进行一场友谊赛而同一组内的人之间不会打任何比赛。
比如4个人,编号为1~4,如果分为两个组并且1,2一个组,3,4一个组,那么一共需要打四场比赛:
1vs3,1vs4,2vs3,2vs4。
而如果是1,2,3一组,4单独一组,那么一共需要打三场比赛:
1vs4,2vs4,3vs4。
很快W.Z意识到,这样的比赛规则可能会让比赛的场数非常多。
W.Z想知道如果有N个人,通过上面这种比赛规则,总比赛场数有可能为K场吗?
比如3个人,如果只分到一组则不需要比赛,如果分到两组则需要2场比赛,如果分为三组则需要3场比赛。
但是无论怎么分都不可能恰需要1场比赛。
相信作为编程高手的你一定知道该怎么回答这个问题了吧?
那么现在请你帮助W.Z吧。
每行为一组数据,包含两个数字N,K(0<
=500,K>
=0)。
20
21
31
32
对输入的N,K如果N个员工通过一定的分组方式可以使比赛场数恰好为K,则输出"
YES"
,否则输出"
NO"
(请全部使用大写字母),每组数据占一行。
YES
NO
第10题蝈蝈计分
蝈蝈小朋友刚刚学会了0~9这十个数字,也跟爸爸妈妈来参加XX每周进行的羽毛球活动。
但是他还没有球拍高,于是大人们叫他记录分数。
聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“324”可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。
可是,后来大人们发现蝈蝈只会用0~9这十个数字,所以当比赛选手得分超过9的时候,他会用一个X来表示10完成记分。
但问题是,当记录为“X35”