C语言竞赛题目大全

2019-08-30 23:10

C语言竞赛题目大全 POWERED BY SYD168 2010年5月7日 问题: 假设在一个32位的机器上,需要将某个外设寄存器的第X位(最低位为第0位,最高位为第31位)设置成0,将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其它位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。 输入的数据仅一行,包括R,X,Y,以逗号\分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合更改后的寄存器值R(16进制输出)。例如: ? Sample Input 12345678,0,3 输出: 1234567c 解题思路: 很简单的位操作,但是需要注意的是Y那里是 110,不能直接或上110,而是先两次SET,在CLR。 答案: #include #define CLR(r, x) r &= ~(1UL << x) //1UL 表示32位无符号数,将r的x位清零。 #define SET(r, y) r |= (1UL << y) //表示将r的y位置零 int main() { int r, x, y; scanf(\ CLR(r,x); //清除x位 SET(r,y); //置位y位 SET(r,y-1); //置位y-1位 CLR(r,y-2); //置位y-2位 printf(\ return 0; } 第1题 破译密码 问题: 据说最早的密码来自于罗马的凯撒大帝。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F)。而你要获得消息原文,也就是要将这个过程反过来。 密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z M 原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U (注意:只有字母会发生替换,其他非字母的字符不变,并且消息原文的所有字母都是大写的。) 输入:最多不超过100个数据集组成,每个数据集之间不会有空行,每个数据集由3部分组成: 1. 起始行:START 2. 密码消息:由1到200个字符组成一行,表示凯撒发出的一条消息. 3. 结束行:END 在最后一个数据集之后,是另一行:ENDOFINPUT。 输出: 每个数据集对应一行,是凯撒的原始消息。 ? Sample Input START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ 1

END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT ? Sample Output IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE 解题思路 凯撒编码,判断字符是否是字母,并循环-5即可,记得要循环哦,非常简单的题目哦 答案: #include #include #include #define N 202 char str[N]={0}; int main() { char *p; gets(str); while( strcmp(str, \ //当没遇到消息集的结尾时 { if ( (strcmp(str, \ //当消息不是开始 &&(strcmp(str, \ //消息不是结尾 { for(p=str; *p !='\\0'; p++) //对输入的串进行解密 { if( isupper(*p) ) //判断是否为大写字符 *p += *p-5 <'A' ? 26-5: -5; //进行转换,考虑边界问题! } puts(str); } gets(str); } return 0; } 第2题 小孩报数问题 //输出字符 //接受下一行 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。或者是求最后出圈人的编号等等类似问题。 输入:第一行输入小孩的人数N(N<=64),接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用逗号\间隔 输出:按人名输出小孩按顺序出列的顺序,每行输出一个人名 ? Sample Input 5 Xiaoming Xiaohua Xiaowang Zhangsan Lisi 2,3

2

? Sample Output Zhangsan Xiaohua Xiaoming Xiaowang Lisi 解题思路:(暂空) 方阵填数 第3题 答案: #include using namespace std; int a[10][10]; void Fun(int n) { int m = 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; j < n-i; j++) { 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++; } for(j = n-i-1; j > i; j--) { if(a[j][i] == 0) 第4题 1.

第五套 a[j][i] = m++; } } if(n%2==1) a[n/2][n/2] = m; } void main() { int n, i, j; cin>>n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) a[i][j] = 0; } Fun(n); for(i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cout << a[i][j] << \} cout <

2. 3. 4. 5. 6. 输出这个整数。 输入年、月、日,输出该日期是该年的第几天。 将学生的学号和成绩存储在数组中,利用循环计算出数组中存储学生的平均成绩,找出高于平均分的学生信息并输出。 输入五个国家的名字,按字母顺序(即按ASCII码从小到大的顺序)排列输出。 用指针实现:任意输入20个数,将它们按照从大到小的顺序输出。 编写一个简单的通讯录管理系统。通讯录包括:姓名、通讯地址、邮编、联系电话,现编写一个通讯录管理系统,可以对通讯录进行输入、显示、查找,通讯录保存到一个文件中。 进制转换问题 第5题 1. 问题描述 实现将N进制到M进制数的转换(1 < N,M <= 36)。对于11到36进制数,其基数使用从A到Z的英文字母(全部为大写)代替。例如对于11进制,其基数10(十进制)使用\表示;对于36进制,其基数35(十进制)使用\表示。被转换的数全部为正数且小于2147483647(long型的最大值)。下表为十进制数100对应的各进制数: 进制 数值 10 100 11 91 16 64 27 3J 35 2U 2. 要求: (1).实现10进制数到M进制数的转换。(2).程序具有较强的容错能力(例如对错误的输入数字串的处理)。(3). N进制到M进制数(1 < N,M < 36)的转换(扩展要求,选做)。 3. 输入: 输入文件名为convert.in,文件内容格式为第一列为被转换数的进制数,第二列为被转换数,第三列为转换后的进制。这三列内容均为字符串形式。每列之间使用一个空格隔开。 4. 输出: 输出文件名为convert.out,文件内容为转换后的数。对于一切错误,则输出“error”字符串。 5. 输入输出文件样例: 样例1 convert.in 10 100 27 样例2 convert.in 3 140 27 答案: #include #include void ten_to_m(char out[], long int data, int M); int judge(int N, long int data); void convert(char out[], int N, long int data, int M); int main() { int N; //N进制 int M; //M进制 long int data; //N进制数 char out[100]; //存放M进制数 /* 打开convert.in这个文件,从文件中读取用到的数据 */ FILE *fp = fopen(\ if (fp != NULL) { fscanf(fp, \ fclose(fp); fp = NULL; }

4

convert.out error convert.out 3J

/* 判断数据data有没有错,如果没错则转换为M进制,如果错则把error 写入out中 */ if (judge(N, data) == 1) { convert(out, N, data, M); } else { strcpy(out, \ } printf(\ /* 把得到的结果写入convert.out文件中去 */ FILE *fw = fopen(\ if (fw != NULL) { fprintf(fw, \ fclose(fw); fw = NULL; } return 0; } /* 判断data有没有错,先把data转换为字符串,然后再进行判断 */ int judge(int N, long int data) { char b[100]; //data转换后放入b中 ten_to_m(b, data, 10); //相当于itoa char *s = b; while (*s != '\\0') { if ((*s-'0') >= N) { return 0; } s++; } return 1; } /* N进制转为M进制,先把N进制转为十进制,再把十进制转为M进制 */ void convert(char out[], int N, long int data, int M) { int a = n_to_ten(N, data); ten_to_m(out , a, M); } /* 十进制转为M进制,当M=10时此函数相当于itoa */ void ten_to_m(char out[], long int data, int M) { int i = 0; int tmp = data; int len; char t; /* 把data转为字符倒序的放入字符数组out中去 */

5


C语言竞赛题目大全.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:云南省高中数学学业水平测试题分类汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: