蓝桥
第一题:
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!
首先从题目描述上可以猜测第一种情况的答案很可能是0。
虽然只需要写答案,还是需要写代码来计算一下。
华哥他们说时间要半分钟半分钟递加,想了一下其实1分钟是可以的,把半分钟部分的代码写在前面而已。
我的代码:
1 #include
2 using namespace 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=%d\ty=%d\n",k,x,y);
14 }
15 printf("y = %d\n",y);
16 }
最后算出的结果,第一种情况是个巨大的负数: -979369984,其实就是等于 0 喽。第二种情况是 94371840,果然一个小数字会引起巨大的差别啊。
第二题:
ABCDE * ? = EDCBA
“ABCDE代表不同的数字,问号也代表某个数字!"
对于题意理解上出现了一些问题,ABCDE代表不同的数字,那能不能是0呢?A作为首位能不能是0呢?我写的时候认为是可以的。华哥他们认为是不可以的。
因为只有5层循环,所以直接for过去了。
我的代码:
1 #include
2 using namespace std;
3
4 int main()
5 {
6 int a,b,c,d,e;
7 for (a=0;a<10;a++)
8 {
9 for (b=0;b<10;b++)
10 {
11 if (b==a) continue;
12 for (c=0;c<10;c++)
13 {
14 if (c==b || c==a) continue;
15 for (d=0;d<10;d++)
16 {
17 if (d==c || d==b || d==a ) continue;
18 for (e=0;e<10;e++)
19 {
20 if (e==d || e==c ||e==b || e==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%d\n",a,b,c,d,e);
24 }
25 }
26 }
27 }
28 }
29 }
30 }
这样得出的结果有三个:02178、04356、21978,前两个都是带前导0的,我都写了上去,也不知道到底应该是怎样,蛋痛啊。
第三题:
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
这个就很简单了,四个递减的正整数 a,b,c,d。1/a+1/b+1/c+1/d=1 即可。考虑到循环的不多,继续暴力 for 循环。
我的代码:
1 #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 ( 1.0/a+1.0/b+1.0/c+1.0/d == 1)
16 printf("%d,%d,%d,%d,0\n",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分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
真不知道出题者是什么想法,全是爆搜题,看了下发现有十层。还是拿递归写吧。
我的代码:
1 #include
2 using namespace std;
3
4 int ans[10];
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<10;k++)
14 printf("%d",ans[k]);
15 printf("\n");
16 }
17 }
18 else
19 {
20 ans[time]=1;
21 play(time+1,score*2);
22 ans[time]=0;
23 play(time+1,score-time-1);
24 }
25 }
26
27 int main()
28 {
29 memset(ans,0,sizeof(ans));
30 play(0,10);
31 }
最后的结果是三个:“1011010000”,“0111010000”,“0010110011” 。
第五题:
这道题是代码填空题,目的是把一个矩阵顺时针旋转。
1 2 3 4 13 9 5 1
5 6 7 8 --> 14 10 6 2
9 10 11 12 15 11 7 3
13 14 15 16 16 12 8 4
题目附带的不完整代码:
1 void rotate(int* x, int rank)
2 {
3 int* y = (int*)malloc(___________________); // 填空
4
5 for(int i=0; i 6 {
7 y[_________________________] = x[i]; // 填空
8 }
9
10 for(i=0; i<RANK*RANK; i++)
11 {
12 x[i] = y[i];
13 }
14
15 free(y);
16 }
17
18 int main(int argc, char* argv[])
19 {
20 int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
21 int rank = 4;
22
23 rotate(&x[0][0], rank);
24
25 for(int i=0; i<RANK; i++)
26 {
27 for(int j=0; j<RANK;
28 {
29 printf("%4d", x[i][j]);
30 }
31 printf("\n");
32 }
33
34 return 0;
35 }
正确的答案应该是:
sizeof(int)*rank*rank
(i%rank)*rank-(i/rank)+rank-1
没记错的话写错了第一问,悲剧。
第六题:
依旧是补全代码,大数乘法,本来还算比较繁杂的,但是题目当时附了图,变的很简单了
题目附带的不完整代码:
1 void bigmul(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 r[3] = n1 % base;
15 r[2] = n1 / base + n2 % base + n3 % base;
16 r[1] = ____________________________________________; // 填空
17 r[0] = n4 / base;
18
19 r[1] += _______________________; // 填空
20 r[2] = r[2] % base;
21 r[0] += r[1] / base;
22 r[1] = r[1] % 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%d\n", x[0],x[1],x[2],x[3]);
32
33 return 0;
34 }
答案:
n2 / base + n3 / base + n4 % base
r[2] / base
第七题:
补全代码,有个6*6的棋盘,预先已经放置了一部分棋子,现在要再补充棋子使得每行每列都有3个棋子
1 int N = 0;
2
3 bool CheckStoneNum(int x[][6])
4 {
5 for(int k=0; k<6; k++)
6 {
7 int NumRow = 0;
8 int NumCol = 0;
9 for(int i=0; i<6; i++)
10 {
11 if(x[k][i]) NumRow++;
12 if(x[i][k]) NumCol++;
13 }
14 if(_____________________) return false; // 填空
15 }
16 return true;
17 }
18
19 int GetRowStoneNum(int x[][6], int r)
20 {
21 int sum = 0;
22 for(int i=0; i<6; i++) if(x[r][i]) sum++;
23 return sum;
24 }
25
26 int GetColStoneNum(int x[][6], int c)
27 {
28 int sum = 0;
29 for(int i=0; i<6; i++) if(x[i][c]) sum++;
30 return sum;
31 }
32
33 void show(int x[][6])
34 {
35 for(int i=0; i<6; i++)
36 {
37 for(int j=0; j<6; j++) printf("%2d", x[i][j]);
38 printf("\n");
39 }
40 printf("\n");
41 }
42
43 void f(int x[][6], int r, int c);
44
45 void GoNext(int x[][6], int r, int c)
46 {
47 if(c<6)
48 _______________________; // 填空
49 else
50 f(x, r+1, 0);
51 }
52
53 void f(int x[][6], int r, int c)
54 {
55 if(r==6)
56 {
57 if(CheckStoneNum(x))
58 {
59 N++;
60 show(x);
61 }
62 return;
63 }
64
65 if(______________) // 已经放有了棋子
66 {
67 GoNext(x,r,c);
68 return;
69 }
70
71 int rr = GetRowStoneNum(x,r);
72 int cc = GetColStoneNum(x,c);
73
74 if(cc>=3) // 本列已满
75 GoNext(x,r,c);
76 else if(rr>=3) // 本行已满
77 f(x, r+1, 0);
78 else
79 {
80 x[r][c] = 1;
81 GoNext(x,r,c);
82 x[r][c] = 0;
83
84 if(!(3-rr >= 6-c || 3-cc >= 6-r)) // 本行或本列严重缺子,则本格不能空着!
85 GoNext(x,r,c);
86 }
87 }
88
89 int main(int argc, char* argv[])
90 {
91 int x[6][6] = {
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("%d\n", N);
103
104 return 0;
105 }
答案:
NumRow != 3 || NumCol != 3
f(x,r,c+1)
x[r][c]==1
第八题:
编程题:这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。
变换的过程如下:
第一步. 把字符串6个一组折叠起来,比如wangximing则变为:
wangxi
ming
第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:
228 202 220 206 120 105
第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 => 2+2+8=12 => 1+2=3
上面的数字缩位后变为:344836, 这就是程序最终的输出结果!
要求程序从标准输入接收数据,在标准输出上输出结果。
输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。
输出格式为:n行变换后的6位密码。
又是一道不够明确的题目 = =!首先没有说明字符串最长有多少位,只好按照尽量长去设计。另外也没有说明当字符串不足6位的时候是否应该补0,0应该补在前面还是后面,我自作主张补在后面了。
我的代码:
1 #include <STDIO.H>
2
3 int litenum(int oldnum)
4 {
5 int newnum=0;
6 if ( oldnum < 10 ) return oldnum;
7 while ( 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("%d\n",&n);
19 while (n--)
20 {
21 int snum[6]={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 snum[time%6] += tmpc;
33 time++;
34 }
35 for (k=0;k<6;k++)
36 {
37 printf("%d",litenum(snum[k]));
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万次模拟,计算出甲队夺冠的概率。
这是这次比赛最蛋疼的题目了,没有说数据是输入来的还是就用题目的这些,要求模拟10万次,那结果是只需要输出甲队的夺冠概率还是模拟的过程也要输出?完全没有说明,一头雾水的敲的这道题。