1、国信蓝桥杯比赛试题与答案2012第三届蓝桥杯软件大赛C/C+语言本科组答案第一题:假设有两种微生物 X 和 YX出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。如果X=10,Y=90 呢?本题的要求就是写出这两种初始条件下,60分钟后Y的数目。题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!1 #include 2 using nam
2、espace std; 3 4 int main() 5 6 int x=10,y=90; 7 int time=60,k; 8 for ( k=1;k=time;k+ ) 9 10 y -= x ;11 if ( k%2=0 ) y *= 2;12 if ( k%3=0 ) x *= 2;13 / printf(%dtime:tx=%dty=%dn,k,x,y);14 15 printf(y = %dn,y);16 消除行号最后算出的结果,第一种情况是个巨大的负数:-979369984,其实就是等于 0。第二种情况是 94371840。第二题:ABCDE * ? = EDCBA“ABCDE代
3、表不同的数字,问号也代表某个数字!1 #include 2 using namespace std; 3 4 int main() 5 6 int a,b,c,d,e; 7 for (a=0;a10;a+) 8 9 for (b=0;b10;b+)10 11 if (b=a) continue;12 for (c=0;c10;c+)13 14 if (c=b | c=a) continue;15 for (d=0;d10;d+)16 17 if (d=c | d=b | d=a ) continue;18 for (e=0;e10;e+)19 20 if (e=d | e=c |e=b | e
4、=a) continue;21 if (a+b*10+c*100+d*1000+e*10000)%(a*10000+b*1000+c*100+d*10+e)=0)22 23 printf(%d%d%d%d%dn,a,b,c,d,e);24 25 26 27 28 29 30 这样得出的结果有三个:02178、04356、21978第三题:有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复. 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船
5、搁浅了。他在航海日志中写到:“.昨天,我正好喝了一瓶.奉劝大家,开船不喝酒,喝酒别开船.”请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。如果有多个可能的答案,请列出所有答案,每个答案占一行。格式是:人数,人数,.例如,有一种可能是:20,5,4,2,01 #include 2 using namespace std; 3 4 int main() 5 6 int a,b,c,d; 7 for (a=20;a=4;a-) 8 9 for (b=a-1;b=3;b-)10 11 for (c=b-1;c=2;c-)12 13 for (d=c-1;d=1;d-)14 15 if (
6、1.0/a+1.0/b+1.0/c+1.0/d = 1)16 printf(%d,%d,%d,%d,0n,a,b,c,d);17 18 19 20 21 消除行号最后算出来的结果有四种,分别是: “20,5,4,2,0” ,“18,9,3,2,0”,“15,10,3,2,0”,“12,6,4,2,0”第四题:某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看
7、比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。1 #include 2 using namespace std; 3 4 int ans10; 5 6 void play(int time,int score) 7 8 int k; 9 if (time=10)10 11 if (score=100)12 13 for (k=0;k 14 10 6 29 10 11 12 15 11 7 313 14 15
8、 16 16 12 8 4题目附带的不完整代码: 1 void rotate(int* x, int rank) 2 3 int* y = (int*)malloc(_); / 填空 4 5 for(int i=0; irank * rank; i+) 6 7 y_ = xi; / 填空 8 9 10 for(i=0; irank*rank; i+) 11 12 xi = yi;13 14 15 free(y);16 17 18 int main(int argc, char* argv) 19 20 int x44 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
9、16; 21 int rank = 4; 22 23 rotate(&x00, rank); 24 25 for(int i=0; irank; i+) 26 27 for(int j=0; jrank; j+) 28 29 printf(%4d, xij); 30 31 printf(n); 32 33 34 return 0; 35 消除行号正确的答案是:sizeof(int)*rank*rank(i%rank)*rank-(i/rank)+rank-1第六题:依旧是补全代码,大数乘法,本来还算比较繁杂的,但是题目当时附了图,变的很简单了题目附带的不完整代码: 1 void bigmul(
10、int x, int y, int r) 2 3 int base = 10000; 4 int x2 = x / base; 5 int x1 = x % base; 6 int y2 = y / base; 7 int y1 = y % base; 8 9 int n1 = x1 * y1; 10 int n2 = x1 * y2; 11 int n3 = x2 * y1; 12 int n4 = x2 * y2; 13 14 r3 = n1 % base; 15 r2 = n1 / base + n2 % base + n3 % base; 16 r1 = _; / 填空17 r0 =
11、n4 / base; 18 19 r1 += _; / 填空20 r2 = r2 % base; 21 r0 += r1 / base; 22 r1 = r1 % base; 23 24 25 int main(int argc, char* argv) 26 27 int x = 0,0,0,0; 28 29 bigmul(87654321, 12345678, x); 30 31 printf(%d%d%d%dn, x0,x1,x2,x3); 32 33 return 0; 34 答案:n2 / base + n3 / base + n4 % baser2 / base第七题:补全代码,有
12、个6*6的棋盘,预先已经放置了一部分棋子,现在要再补充棋子使得每行每列都有3个棋子 1 int N = 0; 2 3 bool CheckStoneNum(int x6) 4 5 for(int k=0; k6; k+) 6 7 int NumRow = 0; 8 int NumCol = 0; 9 for(int i=0; i6; i+) 10 11 if(xki) NumRow+; 12 if(xik) NumCol+; 13 14 if(_) return false; / 填空 15 16 return true; 17 18 19 int GetRowStoneNum(int x6,
13、 int r) 20 21 int sum = 0; 22 for(int i=0; i6; i+) if(xri) sum+; 23 return sum; 24 25 26 int GetColStoneNum(int x6, int c) 27 28 int sum = 0; 29 for(int i=0; i6; i+) if(xic) sum+; 30 return sum; 31 32 33 void show(int x6) 34 35 for(int i=0; i6; i+) 36 37 for(int j=0; j6; j+) printf(%2d, xij); 38 pri
14、ntf(n); 39 40 printf(n); 41 42 43 void f(int x6, int r, int c); 44 45 void GoNext(int x6, int r, int c) 46 47 if(c=3) / 本列已满 75 GoNext(x,r,c); 76 else if(rr=3) / 本行已满 77 f(x, r+1, 0); 78 else 79 80 xrc = 1; 81 GoNext(x,r,c); 82 xrc = 0; 83 84 if(!(3-rr = 6-c | 3-cc = 6-r) / 本行或本列严重缺子,则本格不能空着! 85 GoN
15、ext(x,r,c); 86 87 88 89 int main(int argc, char* argv) 90 91 int x66 = 92 1,0,0,0,0,0, 93 0,0,1,0,1,0, 94 0,0,1,1,0,1, 95 0,1,0,0,1,0, 96 0,0,0,1,0,0, 97 1,0,1,0,0,1 98 ; 99 100 f(x, 0, 0); 101 102 printf(%dn, N); 103 104 return 0; 105 消除行号答案:NumRow != 3 | NumCol != 3f(x,r,c+1)xrc=1第八题:编程题:这个程序的任务就是
16、把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。变换的过程如下:第一步. 把字符串6个一组折叠起来,比如wangximing则变为:wangximing第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:228 202 220 206 120 105第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 = 2+2+8=12 = 1+2=3上面的数字缩位后变为:344836, 这
17、就是程序最终的输出结果!要求程序从标准输入接收数据,在标准输出上输出结果。输入格式为:第一行是一个整数n(100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。输出格式为:n行变换后的6位密码。1 #include 2 3 int litenum(int oldnum) 4 5 int newnum=0; 6 if ( oldnum 0 ) 8 9 newnum += oldnum % 10 ;10 oldnum /= 10;11 12 return litenum(newnum);13 14 15 int main()16 17 int n;18 scanf(%dn,&n
18、);19 while (n-)20 21 int snum6=0,0,0,0,0,0; /密码22 char tmpc;23 int time=0,k;24 /*25 由于题目没有给出输入的字符串的最大长度26 使用while(1)和getchar()来实现几乎不受限的输入 27 */28 while (1)29 30 tmpc=getchar();31 if ( tmpc=n ) break;32 snumtime%6 += tmpc;33 time+;34 35 for (k=0;k6;k+)36 37 printf(%d,litenum(snumk);38 39 printf(n);40 41 return 0;42 第九题:足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表: 甲 乙 丙 丁甲 - 0.1 0.3 0.5乙 0.9 - 0.7 0.4丙 0.7 0.3 - 0.2丁 0.5 0.6 0.8 -数据含义:甲对乙的取胜概率为0.1,丙对乙的胜率为0.3,.现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。(参见【1.jpg】)请你进行10万次模拟,计算出甲队夺冠的概率。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1