2012第三届蓝桥杯预赛(8-10题)
八、密码发生器
问题:
在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了...
这个程序的任务就是把一串拼音字母转换为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位密码。
例如,输入:
5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi
则输出:
772243
344836
297332
716652
875843
参考答案(代码):
密码发生器
#include<stdio.h> #include<string.h> int reduction(int m){ int k=0; if(m<10) return m; while(m){ k += m%10 ; m /= 10 ; } return reduction(k); } void f(char s[],char x[]){ int i,j,n,k; n = strlen(s) ; for(i=0;i<6;i++){ for(k=0,j=i;j<n;j+=6) k+=s[j]; x[i] = reduction(k) + '0' ; } x[6] = '\n' ; } void main(){ char s[100]={"wangximing"}; char x[10000]={""}; int len = 0 , n ; scanf("%d",&n); while(n){ n--; scanf("%s",s); f(s,x+len); len += 7 ; } x[len-1]='\0' ; puts(x); }
九、夺冠概率
问题:
足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。
假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
甲 乙 丙 丁
甲 - 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万次模拟,计算出甲队夺冠的概率。

参考答案(代码):
View Code
#include<stdio.h> #include<stdlib.h> #include<time.h> void main(){ int pk[4][4] = { {0,1,3,5}, {9,0,7,4}, {7,3,0,2}, {5,6,8,0}}; int i,a,a1,b,b1,k,count=0; srand(time(NULL)); for(i=0;i<100000;i++){ a1 = rand()%3 + 1 ;//a的对手 if(rand()%10<pk[0][a1]){//a胜 switch(a1){ case 1: b = 2 ; b1 = 3 ; break; case 2: b = 1 ; b1 = 3 ; break; default: b = 1 ; b1 = 2 ; } if(rand()%10<pk[b][b1]){//b胜 a1 = b ; } else{//b1胜 a1 = b1 ; } if(rand()%10<pk[0][a1]){//a胜 count++; } } } printf("%f\n",count*1.0/100000); }
十、取球游戏
问题:
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7或者8个。
轮到某一方取球时不能弃权!
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
程序运行时,从标准输入获得数据,其格式如下:
先是一个整数n(n<100),表示接下来有n个整数。然后是n个整数,每个占一行(整数<10000),表示初始球数。
程序则输出n行,表示A的输赢情况(输为0,赢为1)。
例如,用户输入:
4
1
2
10
18
则程序应该输出:
0
1
1
0
参考答案(代码):
取球游戏
#include<stdio.h> void main(){ int a[100],n,max; int b[]={1,3,7,8}; bool flag[10001]={0}; int i,j; max = 0 ; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",a+i); if(a[i]>max) max = a[i] ; } for(i=2;i<=max;i++){ for(j=0 ; j<4 && b[j]<i ; j++ ){ if(flag[i-b[j]]==0){ flag[i] = 1 ; break; } } } for(i=0;i<n;i++) printf("%d\n",flag[a[i]]); }


浙公网安备 33010602011771号