您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 2012年全国软件大赛真题及其答案
2012年全国软件大赛真题及其答案12012年全国软件大赛真题及其答案第一题/*微生物增殖假设有两种微生物X和YX出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。现在已知有新出生的X=10,Y=89,求60分钟后Y的数目。如果X=10,Y=90呢?本题的要求就是写出这两种初始条件下,60分钟后Y的数目。*/#includestdio.hintmain(void){_int64x=10;_int64y=90;inttime=60;inttime_t=time*10;for(intt=5;t=time_t;t+=5){if(y=0){y=0;break;}if(t%5==0&&t%10!=0){y=y-x;}if(t%30==0){x=x*2;}if(t%20==0){y=y*2;}2012年全国软件大赛真题及其答案2}printf(y=%d\n,y);return0;}答案:094371840第二题:/*古堡算式福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:ABCDE*?=EDCBA他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”华生:“我猜也是!”于是,两人沉默了好久,还是没有算出合适的结果来。请你利用计算机的优势,找到破解的答案。把ABCDE所代表的数字写出来。答案写在“解答.txt”中,不要写在这里!*/#includestdio.hconstintTRUE=1;constintFALSE=0;intmain(void){for(inti=10000;i1000000;i++){inta[5]={0};a[4]=i%10;a[3]=i/10%10;a[2]=i/100%10;a[1]=i/1000%10;a[0]=i/10000%10;boolFlag=TRUE;2012年全国软件大赛真题及其答案3for(intj=0;j5&&Flag;j++){for(intk=0;k5&&Flag;k++){if(j!=k&&a[j]==a[k]){Flag=FALSE;}}}if(!Flag)continue;intnum=10000*a[4]+1000*a[3]+100*a[2]+10*a[1]+a[0];for(intj=2;j10;j++){if(i*j==num){printf(%d*%d=%d\n,i,j,num);}}}return0;}答案:21978*4=87912第三题:/*/*比酒量有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复......直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。如果有多个可能的答案,请列出所有答案,每个答案占一行。2012年全国软件大赛真题及其答案4格式是:人数,人数,...例如,有一种可能是:20,5,4,2,0答案写在“解答.txt”中,不要写在这里!*/#includestdio.hintmain(void){for(inti=2;i4;i++){for(intj=i+1;j6;j++){for(intm=j+1;m12;m++){for(intn=m+1;n21;n++){intnumber=j*m*n+i*m*n+i*j*n+i*j*m;intother=i*j*m*n;if(number==other){printf(%d\t%d\t%d\t%d\t0\n,n,m,j,i);}}}}}return0;}答案:1893201510320205420126420第四题:/*奇怪的比赛2012年全国软件大赛真题及其答案5某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。*/#includestdio.hinta[10]={0};voidf(intt,ints);intmain(void){intt=0;ints=10;f(t,s);return0;}voidf(intt,ints){if(t==10&&s==100){for(inti=0;i10;i++){printf(%d,a[i]);}printf(\n);}elseif(t10){a[t]=0;f(t+1,s-t-1);a[t]=1;f(t+1,s*2);2012年全国软件大赛真题及其答案6}return;}答案:001011001101110100001011010000第五题:/*转方阵对一个方阵转置,就是把原来的行号变列号,原来的列号变行号例如,如下的方阵:12345678910111213141516转置后变为:15913261014371115481216但,如果是对该方阵顺时针旋转(不是转置),却是如下结果:13951141062151173161284下面的代码实现的功能就是要把一个方阵顺时针旋转。*/#includestdio.h#includestdlib.hvoidrotate(int*x,intrank)2012年全国软件大赛真题及其答案7{int*y=(int*)malloc(rank*rank*sizeof(int));//填空for(inti=0;irank*rank;i++){y[rank-1-i/rank+i%rank*rank]=x[i];//填空}for(inti=0;irank*rank;i++){x[i]=y[i];}free(y);}intmain(intargc,char*argv[]){intx[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};intrank=4;rotate(&x[0][0],rank);for(inti=0;irank;i++){for(intj=0;jrank;j++){printf(%d\t,x[i][j]);}printf(\n);}return0;}/*第六题:大数乘法对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。如图【1.jpg】表示了分块乘法的原理。可以把大数分成多段(此处为2段)小数,然后用小数的多次运算组合表示一个大数。2012年全国软件大赛真题及其答案8可以根据int的承载能力规定小块的大小,比如要把int分成2段,则小块可取10000为上限值。注意,小块在进行纵向累加后,需要进行进位校正。以下代码示意了分块乘法的原理(乘数、被乘数都分为2段)。*/#includestdio.hvoidbigmul(intx,inty,intr[]){intbase=10000;intx2=x/base;intx1=x%base;inty2=y/base;inty1=y%base;intn1=x1*y1;intn2=x1*y2;intn3=x2*y1;intn4=x2*y2;r[3]=n1%base;r[2]=n1/base+n2%base+n3%base;r[1]=n2/base+n3/base+n4%base;//填空r[0]=n4/base;r[1]+=r[2]/base;//填空r[2]=r[2]%base;r[0]+=r[1]/base;r[1]=r[1]%base;}intmain(intargc,char*argv[]){intx[]={0,0,0,0};//这是原本程序的代bigmul(87654321,12345678,x);//printf(%d\t%d\t%d\t%d\n,x[0],x[1],x[2],x[3]);//以下添加如下代码,以便适用于任意不多于8位数两个相乘//bigmul(25000,40000,x);2012年全国软件大赛真题及其答案9inta[4][4];for(inti=0;i4;i++){a[i][3]=x[i]%10;a[i][2]=x[i]/10%10;a[i][1]=x[i]/100%10;a[i][0]=x[i]/1000;}boolSIGN=true;intindex_i,index_j;for(inti=0;i4;i++){for(intj=0;j4;j++){if(a[i][j]==0){continue;}else{index_i=i;index_j=j;SIGN=false;break;}}if(SIGN==false){break;}}for(intj=index_j;j4;j++){printf(%d,a[index_i][j]);}printf(,);for(inti=index_i+1;i4;i++){for(intj=0;j4;j++){2012年全国软件大赛真题及其答案10printf(%d,a[i][j]);}printf(,);}printf(\n);return0;}/*第七题:放旗子今有6x6的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子(如图【1.jpg】)。我们希望推算出所有可能的放法。下面的代码就实现了这个功能。初始数组中,“1”表示放有棋子,“0”表示空白。*/#includestdio.hintN=0;boolCheckStoneNum(intx[][6]){for(intk=0;k6;k++){intNumRow=0;intNumCol=0;for(inti=0;i6;i++){if(x[k][i])NumRow++;if(x[i][k])NumCol++;}if(NumRow!=3||NumCol!=3)returnfalse;//填空}returntrue;}intGetRowStoneNum(intx[][6],intr){intsum=0;for(inti=0;i6;i++)if(x[r][i])2012年全国软件大赛真题及其答案11sum++;returnsum;}intGetColStoneNum(intx[][6],intc){intsum=0;for(inti=0;i6;i++)if(x[i][c])sum++;returnsum;}voidshow(intx[][6]){for(inti=0;i6;i++){for(intj=0;j6;j++)printf(%2d,x[i][j]);printf(\n);}printf(\n);}voidf(intx[][6],intr,intc);voidGoNext(intx[][6],intr,intc){if(c6)f(x,r,c+1);//填空elsef(x,r+1,0);}voidf(intx[][6],intr,intc){if(r==6){if(CheckStoneNum(x)){N++;show(x);}return;}2012年全国软件大
本文标题:2012年全国软件大赛真题及其答案
链接地址:https://www.777doc.com/doc-3035814 .html