文章目录

  • 前言
  • 一、微生物增殖
  • 二、古堡算式
  • 三、比酒量
  • 四、奇怪的比赛
  • 五、方阵转置
  • 六、大数乘法
  • 七、放棋子
  • 八、密码发生器
  • 九、夺冠概率
  • 十、取球游戏

上一篇: 小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
下一篇: 在肝了在肝了
历年题目合集:题目合集


前言

哥几个又来学习了【手动狗头】

一、微生物增殖

题目描述:
假设有两种微生物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种群灭绝的最后一根稻草!

分析分析:
老模拟题了
每半分钟:Y=Y-X
每3分钟: X=2 *X
每6分钟: Y=2 *Y
这里我们可能要注意一下,就是半分钟可能不好处理,那我们就直接扩大两倍
题目代码:

#include <stdio.h>
int main()
{int x=10;int y=89;for(int i=1;i<=120;i++){if(i%2==1){y=y-x;}if(i%4==0){y=2*y;}if(i%6==0){x=2*x;}}printf("%d    %d",x,y);
}

运行结果:

10485760  -979369984

二、古堡算式

题目描述:
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:ABCDE*?=EDCBA。他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!”,于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案,把ABCDE所代表的数字写出来。
分析分析:
和小唐练了这么就,直接来吧
#include
next_permutation
题目代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{int a[10] = {0,1,2,3,4,5,6,7,8,9};while(next_permutation(a,a+10))    {if(a[0]!=0&&a[4]!=0)//全排列  {int leftVal = a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];int rightVal = a[4]*10000+a[3]*1000+a[2]*100+a[1]*10+a[0];int temp = a[5];if(leftVal*temp==rightVal){cout << a[0] << a[1] << a[2] << a[3] << a[4] <<endl;break;}}}return 0;
}

运行结果:

21978

三、比酒量

题目描述:
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复----直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“…昨天,我正好喝了一瓶…奉劝大家,开船不喝酒,喝酒别开船…”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。如果有多个可能的答案
分析分析:
这个题目的话,也是一个小小的模拟,四个小小的for循环,每一次循环的的最大值要小于上一次循环的最小值(就是说我们这一次倒下的人,不可以多余上一场清醒的人数),最后的时候再去把这些加起来,只要等于1,我们就去输出
题目代码:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{for(int a = 1; a <= 20; a++){for(int b = 1; b < a; b++){for(int c =1; c < b; c++){for(int d = 1; d < c; d++){if((1.0/a+1.0/b+1.0/c+1.0/d)==1){cout << a << ends << b << ends <<c << ends << d << "0" <<endl;}}}}}
}

运行结果:

12 6 4 20
15 10 3 20
18 9 3 20
20 5 4 20

四、奇怪的比赛

题目描述:
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手的起步分都是10分,某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可用仅含1和0的串来表示,如0010110011就是可能的情况。
你的任务是算出所有可能情况,每个答案占一行。
分析分析:
想找个题目的话,就是一个简简单单的递归,我们主要就是去找到我们的递归体,正确的赋值1,错误的0,然后等到正好10个题目的时候我们就判断他的得分是不是100,是的话我们就去输出
题目代码:

#include <stdio.h>
int huida[11]={0};
void fort(int sum,int ti)
{if(ti==11){if(sum==100){for(int i=1;i<11;i++){printf("%d",huida[i]);}printf("\n");}}else{huida[ti]=1;fort(sum*2,ti+1);huida[ti]=0;fort(sum-ti,ti+1);}
}
int main()
{fort(10,1);
}

运行结果:

1011010000
0111010000
0010110011

五、方阵转置

题目描述:
对一个方阵转置,就是把原来的行号变列号,原来的列号变行号。例如,如下方阵:

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16

转置后变为:

1 5 9  13
2 6 10 14
3 7 11 15
4 8 12 16

但如果是对该方阵顺时针旋转(不是转置),却是如下结果:

13 9  5 1
14 10 6 2
15 11 7 3
16 12 8 4

下面代码实现的功能就是要把一个方阵顺时针旋转,请推测划线处的代码

void rotate(int *x,int rank)
{ int *y=(int*)malloc(___________________);  //填空for(int i=0;i<rank*rank;i++){ y[___________________]= x[i];  //填空}for(i=0;i<rank*rank;i++) x[i]=y[i];free(y);
}int main(int argc,char *argv[])
{ int x[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};int rank=4;rotate(&x[0][0],rank);for(int i=0;i<rank;i++){ for(int j=0;j<rank;j++)  printf("%4d",x[i][j]);printf("\n");}return 0;
}

分析分析:
就是一个找规律的题目,然后我们在这里有一个malloc,可能学习过数据结构的同学比较清楚,就是一个对于内存的分配
剩下的就是将我们原始值开始赋值,我们很明显可以看出,他是不是我们行列转化之后,再将前后位置进行一个颠倒,这样就很明显出来了
题目代码:

【第一空】
rank*rank*sizeof(int)
【第二空】
y[(i%4)*4+3-i/4] = x[i];

六、大数乘法

题目描述:
对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择_int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓“分块法”。下图表示了分块乘法的原理。

可以把大数分成多段(此处为2段)小数,然后用小数的多次运算组合表示一个大数。可以根据int的承载能力规定小块的大小,比如要把int分成2段,则小块可取10000为上限值。注意,小块在进行纵向累加后,需要进行进位校正。以下代码示意了分块乘法的原理(乘数、被乘数都分为2段),请分析代码逻辑,并推测划线处的代码。

void bigmul(int x,int y,int r[])
{ int base=10000;int x2=x/base;int x1=x%base;int y2=y/base;int y1=y%base;int n1=x1*y1;int n2=x1*y2;int n3=x2*y1;int n4=x2*y2;r[3]=n1%base;r[2]=n1/base+n2%base+n3%base;r[1]=____________________;  //填空r[0]=n4/base;r[1]+=____________________;  //填空r[2]=r[2]%base;r[0]+=r[1]/base;r[1]=r[1]%base;
}int main(int argc,char *argv[])
{ int x[]={0,0,0,0};bigmul(87654321,12345678,x);printf("%d%d%d%d\n",x[0],x[1],x[2],x[3]);return 0;
}

分析分析:
这个其实考察的还是我们的分析,这个题目我们只要把%1000和/1000看懂了就可以啦,%就是取我们的后4位,/取的就是前4位,我们再结合前面的代码,over
题目代码:

【第一空】
n2 / base + n3 / base + n4 % base; // 填空
【第二空】
r[2] / base;

七、放棋子

题目描述:
今有6×6的棋盘,其中某些格子已预放了棋子。现在要再放上去一些,使得每行每列都正好有3颗棋子。我们希望推算出所有可能的放法,下面的代码就实现了这个功能。初始数组中,“1”表示放有棋子,“0”表示空白。请推测划线处的代码。


int N = 0;bool CheckStoneNum(int x[][6])
{for(int k=0; k<6; k++){int NumRow = 0;int NumCol = 0;for(int i=0; i<6; i++){if(x[k][i]) NumRow++;if(x[i][k]) NumCol++;}if(_____________________) return false;  // 填空}return true;
}int GetRowStoneNum(int x[][6], int r)
{int sum = 0;for(int i=0; i<6; i++)  if(x[r][i]) sum++;return sum;
}int GetColStoneNum(int x[][6], int c)
{int sum = 0;for(int i=0; i<6; i++)  if(x[i][c]) sum++;return sum;
}void show(int x[][6])
{for(int i=0; i<6; i++){for(int j=0; j<6; j++) printf("%2d", x[i][j]);printf("\n");}printf("\n");
}void f(int x[][6], int r, int c);void GoNext(int x[][6],  int r,  int c)
{if(c<6)_______________________;   // 填空elsef(x, r+1, 0);
}void f(int x[][6], int r, int c)
{if(r==6){if(CheckStoneNum(x)){N++;show(x);}return;}if(______________)  // 已经放有了棋子{GoNext(x,r,c);return;}int rr = GetRowStoneNum(x,r);int cc = GetColStoneNum(x,c);if(cc>=3)  // 本列已满GoNext(x,r,c);  else if(rr>=3)  // 本行已满f(x, r+1, 0);   else{x[r][c] = 1;GoNext(x,r,c);x[r][c] = 0;if(!(3-rr >= 6-c || 3-cc >= 6-r))  // 本行或本列严重缺子,则本格不能空着!GoNext(x,r,c);  }
}int main(int argc, char* argv[])
{int x[6][6] = {{1,0,0,0,0,0},{0,0,1,0,1,0},{0,0,1,1,0,1},{0,1,0,0,1,0},{0,0,0,1,0,0},{1,0,1,0,0,1}};f(x, 0, 0);printf("%d\n", N);return 0;
}

分析分析:
我们遇到这种就老老实实的去把代码看一遍就可以啦

bool CheckStoneNum(int x[][6])//checkStoneNum 意为 检查棋子数量
前面的时候就是在选择看是不是6*6列,然后把我们的行列都加加
后面的话就是在判断我们是不是3个相连了
void GoNext(int x[][6],  int r,  int c)//递归到下一个位子
一个小小递归,没有走完我们就继续走
void f(int x[][6], int r, int c)//深度优先搜索

题目代码:

【第一空】
if(NumRow!=3||NumCol!=3)
【第二空】
if(x,r,c+1);
【第三空】
if(x[r][c]==1)

八、密码发生器

题目描述:
在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了…。这个程序的任务就是把一串拼音字母转换为6位数字(密码),我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。变换的过程如下:
第1步:把字符串6个一组折叠起来,比如wangximing则变为:
wangxi
ming
第2步:把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:228 202 220 206 120 105
第3步:再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如,228 => 2+2+8=12 => 1+2=3
上面的数字缩位后变为:344836, 这就是程序最终的输出结果!
要求程序从标准输入接收数据,在标准输出上输出结果。
输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。
输出格式为:n行变换后的6位密码。
分析分析:
这个的话,就是相当于求我们单个的ascii码相加,按照6个一空,我们叠加到一起,然后我们在对于和进行计算直到只有一位数
题目代码:

#include<iostream>
using namespace std;
//使用递归计算最后值
int qiu(int num)
{if(num<10){return num;}int sum = 0;while(num){sum += num%10;num/=10;}return qiu(sum);
}
int main()
{int n;//a数组保存每个位置的最后值 int a[6] = {0};string str;cin >> n;for(int i =0; i < n; i++){cin >> str;for(int i = 0; i < str.size(); i++){a[i%6] += (str[i]-'a'+97);//将ascii码值转化 }for(int i = 0; i < 6; i++){cout << qiu(a[i]);a[i] = 0;}cout <<endl;}return 0;
} 

运行结果:

【输入样例】
5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi
【输出样例】
772243
344836
297332
716652
875843

九、夺冠概率

题目描述:
足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。假设有甲、乙、丙、丁四个球队,根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
甲 乙 丙 丁
甲 - 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,…。现在要举行一次锦标赛,双方抽签,分两个组比,获胜的两个队再争夺冠军(参见下图)。

请你进行10万次模拟,计算出甲队夺冠的概率
分析分析:
我们的话就直接分为3种情况

题目代码:

#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
double p[3];
int main(){//三种情况的概率 p[0] = 0.1*0.8*0.5 + 0.1*0.2*0.3;p[1] = 0.3*0.6*0.5 + 0.3*0.4*0.1;p[2] = 0.5*0.7*0.1 + 0.5*0.3*0.3;//用来记录10万次概率的总和 double sum = 0;//设置随机数种子 srand(time(NULL));for(int i=1 ;i<=100000 ;i++){int r = rand()%3;sum += p[r];} printf("%f\n",sum/100000);return 0;
}

十、取球游戏

题目描述:
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:每个人从盒子中取出的球的数目必须是:1,3,7或者8个;轮到某一方取球时不能弃权;A先取球,然后双方交替取球,直到取完;被迫拿到最后一个球的一方为负方(输方)。
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
程序运行时,从标准输入获得数据,其格式如下:
先是一个整数n(n<100),表示接下来有n个整数;然后是n个整数,每个占一行(整数<10000),表示初始球数。
程序则输出n行,表示A的输赢情况(输为0,赢为1)。
分析分析:
我们去做的话,主要就是一个模拟运算
题目代码:

#include <string.h>
#include <stdio.h>
int op[4]= {1,3,7,8};//四种操作
int main()
{int n,a[10000],m;memset(a,0,sizeof(a));//先都初始化为0for(int i=1; i<10000; i++)//用i表示球的数量for(int j=0; j<4; j++)//四种情况一一判断,一旦发现一个可以使A获胜的取法就可以了。if(i-op[j]>0)//首先保证在这种情况下有足够球可取{if(a[i-op[j]]==0)//A取完,剩下的球让B来取,已经没有胜利的可能(此时可以看做对于i-op[j]个球是B先取,为0表示B只能失败){a[i]=1;//i个球A先取的情况A可以取胜break;}}scanf("%d",&n);while(n--){scanf("%d",&m);printf("%d\n",a[m]);}return 0;
}

运行结果:

【输出样例】
4
1
2
10
18
【输出样例】
0
1
1
0

上一篇: 小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
下一篇: 在肝了在肝了
历年题目合集:题目合集

小唐开始刷蓝桥(九)2012年第三届C/C++ B组蓝桥杯省赛真题相关推荐

  1. 小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.高斯日记 二.马虎的算式 三.第39级台阶 四.黄金连分数 五.前缀判断 六.三部排序 七.错误票据 八.翻硬币 九.带分数 十.连号区间数 上一篇: 小唐开始刷蓝桥(七)2014 ...

  2. 小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.组队 二.年号字符 三.数列求值 四.数的分解 五.迷宫 六.特别数的和 七.完全二叉树的权值 八.等差数列 九.后缀表达式 十.灵能传输 上一篇: 小唐开始刷蓝桥(一)2020年 ...

  3. 小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题

    目录 一.门牌制作 二.既约分数 三.蛇形填数 四.跑步锻炼 五.七段码 六.成绩统计 七.回文日期 八.子串分值和 九.平面切分 十.字串排序 上一篇: 呆呆子,这就是小唐的第一篇啦! 下一篇: 小 ...

  4. 小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.奖券数目 二.星系炸弹 三.三羊献瑞 四.格子中输出 五.九数组分数 六.加法变乘法 七.牌型种数 八.移动距离 九.垒骰子 十.生命之树 上一篇: 小唐开始刷蓝桥(五)2016年 ...

  5. 小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.第几天 二.明码 三.乘积尾零 四.测试次数 五.快速排序 六.递增三元组 七.螺旋折线 八.日志统计 九.全球变暖 十.乘积最大 上一篇: 小唐开始刷蓝桥(二)2019年第十届C ...

  6. 小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.啤酒和饮料 二.切面条 三.李白打酒 四.史丰收速算 五.打印图形 六.奇怪的分式 七.六角填数 八.蚂蚁感冒 九.地宫取宝 十.小朋友排队 上一篇: 小唐开始刷蓝桥(六)2015 ...

  7. 小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.购物单 二.等差素数列 三.承压计算 四.方格分割 五.取数位 六.最大公共子串 七.日期问题 八.包子凑数 九.分巧克力 十.k倍区间 上一篇: 小唐开始刷蓝桥(三)2019年第 ...

  8. 小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.煤球数目 二.生日蜡烛 三.凑算式 四.快速排序 五.抽签 六.方格填数 七.剪邮票 八.四平方和 九.交换瓶子 十.最大比例 上一篇: 小唐开始刷蓝桥(四)2017年第八届C/C ...

  9. 蓝桥到此一游—2012年C/C++ B组蓝桥杯省赛真题(一)

    目录 一,微生物增殖 二,古堡算式 三.比酒量 四,奇怪的比赛 五,方阵转置 六,大数乘法 七,放棋子 八,密码发生器 九,夺冠概率 十,取球游戏 一,微生物增殖 题目 假设有两种微生物X和Y,X出生 ...

最新文章

  1. 设Excle的cell中显示一个下拉列表选择框
  2. JAVA数据结构 线性表的链式存储及其实现
  3. Thinking in work
  4. 虚拟机nat固定IP上网配置
  5. 树莓派GPIO的两种模式区别
  6. java 内部类异常_Java笔记(三 内部类、异常、编程规范)
  7. 两概率分布交叉熵的最小值是多少?
  8. ABAP 标准培训教程 BC400 学习笔记之三:ABAP 编程语言的特性和基本构成要素
  9. iOS Tips 模拟器屏幕截图
  10. 为什么我会在2012年的新企业Java项目中使用Java EE而不是Spring
  11. 几张图可以理解GC JVM调优的内容
  12. 教你用纯Java实现一个即时通讯系统(附源码)
  13. mockjs的介绍、基本使用和封装
  14. C 中的左值(Lvalues)和右值(Rvalues)
  15. NYOJ 42一笔画问题||欧拉图
  16. java面试之反射机制
  17. 安装西门子博图一直重启_西门子博图重启后继续安装没完成的程序怎么去除?...
  18. 网易公开课 IPHONE开发
  19. 【系统架构】-什么是MDA架构、ADL、DSSA
  20. cpu计算速度排行榜_中央处理器cpu性能排名

热门文章

  1. 内容安全策略CSP(Content-Security-Policy)
  2. 常用快递电子面单api接口及对接调用方式
  3. AppScan安全问题解决方案
  4. 基于FPGA的GigE Vision相机图像采集方案设计
  5. OS X 平台的 8 个实用终端工具
  6. CTF平台实时榜单功能后端设计方案
  7. 树莓派连接不上华为随身wifi
  8. 抖音评论区有什么用该怎么维护?掌握几点让你挣qian倍增长。
  9. 支持批量图片转文字的免费【OCR】文字识别工具,支持截图识别和批量图片识别,开源工具,速度快,准确度高,免费OCR,开源软件
  10. VCU 整车控制器应用层模型VCU模型,整车控制器基于工具包快速原型开发