2011年国信蓝点软件设计大赛 C本科 模拟题+答案.doc_第1页
2011年国信蓝点软件设计大赛 C本科 模拟题+答案.doc_第2页
2011年国信蓝点软件设计大赛 C本科 模拟题+答案.doc_第3页
2011年国信蓝点软件设计大赛 C本科 模拟题+答案.doc_第4页
2011年国信蓝点软件设计大赛 C本科 模拟题+答案.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2011 模拟 c语言 本科 试题注意:本套模拟题主要模拟命题形式与考核范围。真实竞赛题的数量、难度可能与此套模拟题有差异。说明:本试卷包含两种题型:“代码填空”与“程序设计”。填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不多于一条语句(即不能出现分号)。编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。1. 代码填空(满分2分)下列代码,把一个2位整数交换十位与个位的位置。请填写缺失的代码。例如:当x=95时,返回59。int switch_num(int x)int a = x / 10;int b = x % 10;return _b*10+a_;2. 代码填空(满分3分)下列代码把一个二进制的串转换为整数。请填写缺少的语句;char* p = 1010110001100;int n = 0;for(int i=0;ib) swap(&a, &b);if(bc) swap(&b, &c);if(ab) swap(&a, &b);int m = b;4. 代码填空(满分5分)计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是组合数学的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。int f(int m, int n)if(m=0 | n=0) return 1;return _f(m-1,n)+f(m,n-1)_;5. 代码填空(满分6分)此段代码的意图是把一个缓冲区中的整数重新排列,使得所有负数都在正数的左边。请分析其工作流程,补充缺失的代码。void reorder(int *pData, int len) if(pData = NULL | len = 0) return; int *pBegin = pData; int *pEnd = pData + len - 1; while(pBegin pEnd) if(*pBegin=0) pEnd -; continue; int temp = *pBegin; *pBegin = *pEnd; *pEnd = temp; int main(int argc, char *argv)int a = 1,2,3,-5,-4,5,9,-8,-1;reorder(a, 9);for(int i=0; i9; i+) printf(%d , ai);printf(n);return 0; 6. 代码填空(满分9分)给定一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列(全排列)情形。例如:给定字符串“xyz”,则程序输出:xyzxzyyxzyzxzyxzxy试完善程序中空缺的部分。void f(char *str, int len, int n) int i; char tmp; char *p = (char *)malloc(len+1); if(n=len-1) printf(%sn,str); else for(i=n;ilen;i+) strcpy(p,str); tmp = *(str+n); *(str+n) = *(str+i); *(str+i) = tmp; f(str,len,n+1); strcpy(str,p); free(p); int main(int argc, char *argv) char str = xyz; f(str,3,0); printf(n); return 0; 7. 代码设计(满分5分)625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:625#include #include void main()int i,num;printf(所有三位数的平方最后三位数是其本身的数有:n);for(i=100;i=999;i+)num = (int)pow(i,2);num = num%1000;if(num = i)printf(%dn,i);8. 代码设计(满分11分)某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。现在已知:双方开始时的体力值甲:1000,乙:2000。假设战斗中,甲乙获胜的概率都是50%求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。/题目分析:双方经过4个回合的战斗有16种胜负的排列/每次的概率为1/16,取出其中的体力之差小于1000的情况,然后乘以1/16即可#include #include void main()double tax;/记录总概率double x,y;/x,y分别表示甲乙的体力int i,count,temp,j;count = (int)pow(2,4);tax = 0;for(i=0;icount;i+)x = 1000;y = 2000;for(j=0;j4;j+)temp=1;/用来表示0001,0010,0100,1000,分别表示甲第一二三四次是否胜利temp = tempj;if(i&temp) = temp)/检验甲第一二三四次每次是否胜利x += y/4;y -= y/4;elsey += x/4;x -= x/4;printf(%d %fn,i,fabs(x-y);if(fabs(x-y) 1000)tax += 1.0/16;printf(体力之差小于1000的理论概率为:%lfn,tax);9. 代码设计(满分18分)整数的分划问题。 如,对于正整数n=6,可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1+1 现在的问题是,对于给定的正整数n,编写算法打印所有划分。用户从键盘输入 n (范围110)程序输出该整数的所有划分。#include void fun(int *result);void main()int result12;int i,n,k;printf(请输入一个110的整数:);scanf(%d,&n);if(n10)printf(输入有误!n);return;printf(正整数%d所有划分如下:n,n);for(i=n;i0;i-)for(k=0;kresultk-1)resultk+1 = resultk - resultk-1;resultk = resultk-1;k+;k=k-1;if(k=0)printf(%d,resultk-1);return;elsej=0;while(resultj!=0)printf(%d,resultj);printf(+);j+;printf(b,);while(k!=0&resultk1)|k1)if(resultk!=1)resultk+1+;resultk-;elsei=k-1;while(i0)if(resulti1)break;i-;if(i0)for(j=k;j=i;j-)resultj+1+;resultj-;elsebreak;fun(result);k-;printf(b );10. 代码设计(满分20分)一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。例如:当N=3时,153就满足条件,因为 13 + 53 + 33 = 153,这样的数字也被称为水仙花数(其中,“”表示乘方,53表示5的3次方,也就是立方)。当N=4时,1634满足条件,因为 14 + 64 + 34 + 44 = 1634。当N=5时,92727满足条件。实际上,对N的每个取值,可能有多个数字满足条件。程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。#include #include typedef structint num30;/存放0-9的21次方int max_index;/标记0-9的21次方数的最高位的下标int max_num;/统计0-9的在21位数中最多有多少位BigInter;int flag;void Init_BigInter(BigInter *numberflag);void findnumber(int *num,BigInter *numberflag,int *sign,int No,int index);int Add_BigInter(int *num,BigInter number,int i);int IsLetter21(int *num);int IsRight(int *num,int *sign);void main()int i,j;int num30;int sign10=0;/记录0-9在21位数中的的个数BigInter numberflag10;int time=GetTickCount();Init_BigInter(numberflag);flag=1;printf(21位数中的水仙花数有:n);for(i=numberflag9.max_num;i=0;i-)for(j=0;j=0;j-)printf(%d,numj);printf(n);elsefor(i=index;i=0;i-)for(j=0;j30;j+)tempj = numj;signNo=i;if(Add_BigInter(num,numberflagNo,i)for(j=0;j30;j+)numj = tempj;continue;findnumber(num,numberflag,sign,No-1,index-i);for(j=0;j30;j+)numj = tempj;int IsLetter21(int *num)if(num20=0)return 1;elsereturn 0;int IsRight(int *num,int *sign)int count10=0;int i;for(i=0;i21;i+)countnumi+;for(i=0;i10;i+)if(counti!=signi)break;if(i=10)return 1;elsereturn 0;int Add_BigInter(int *num,BigInter number,int i)int k;if(i!=0)k=0;while(k=number.max_index)numk += number.numk*i;k+;k=0;while(k=number.max_index|numk/10!=0)if(numk/10 = 0)k+;continue;numk+1 += numk/10;numk %= 10;k+;k=21;while(k30)if(numk!=0)return 1;k+;return 0;void Init_BigInter(BigInter *numberflag)int i,j,k;int max;int count=0;int num30;for(i=0;i=9;i+)numberflagi.num0=1;for(j=1;j30;j+)numberflagi.numj=0;for(i=0;i=9;i+)numberflagi.max_index=0;if(i=0|i=1)numberflagi.num0=i;numberflagi.max_num = 21;elsefor(j=1;j=21;j+)k=0;while(k=numberflagi.max_index)numberflagi.numk *= i;k+;k=0;while(k numberflagi.max_index)numberflagi.max_index = k;/whileco

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论