蓝桥杯-结果填空题

最后更新于:2022-04-01 14:53:31

微生物增殖—除去次方数—古堡算式—奇怪的比赛—欧拉与鸡蛋 ①微生物增殖 假设有两种微生物 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.5分钟的,很麻烦,所以不如都X2,总共为120, 每隔0.5分钟即为每隔1。 这样,这道题可以分析为: X每隔6分裂一次,Y每隔4分裂一次。 新生X每隔1吃Y,此后每隔2吃Y。 求120后,Y的数目。 肯定不能拿手算啦。。好累的o(╯□╰)o, 可以仔细分析一下题目,可以用一个for循环模拟时间的增长, 那么就可以对4,6取模来判定X、Y的分裂时间。 最关键就是X什么时候吃Y,或许刚开始考虑的时候,你觉得要分新生X与以前的X, 可是,你仔细看就会发现不然,Y每隔4才分裂一次,而新生的X与老X吃Y时间是重合的。 所以,只要是奇数个时间段(以120为总和的时间段)就会吃Y。 可以画一个时间轴来更清晰的表示出来: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-22_576a44afb9071.jpg) 我们可以很清晰的看出,红蓝点会重合,也就是新生的X与以前的X吃Y的时间段是重合的,所以,就可以通过 判断是否为奇数断点来吃Y。 代码: ~~~ #include <iostream> using namespace std; int main() { int time; int x=10,y=89; // 第二次把Y改成90就可以了 for(time=1;time<=120;++time) { if(time%2==1) y-=x; if(time%4==0) y+=y; if(time%6==0) x+=x; if(y<0) {y=0;break;} } cout<<y<<endl; return 0; } ~~~ ②除去次方数 自然数的平方数是:1 4 9 16 25 … 自然数的立方数是:1 8 27 64 125 … 自然数的4次方数是:1 16 81256 … … 这些数字都可以称为次方数。 1~10000中,去掉所有的次方数,还剩下多少个数字? 这题完全可以用筛法求素数的方式来计算哟, 就是注意一下,最大到多少次方,2的几次方大于10000呢? 众所周知,2^10=1024 -> 2^14>10000 代码: ~~~ #include <iostream> #include <cmath> #include <string.h> using namespace std; bool no[10001]; int main() { int i,j,k; int num,sum; memset(no,0,sizeof(no)); // j为次方数 for(j=2;j<=14;++j) { // i为底数 i=1; k=pow(i++,j); while(k<10001) { no[k]=1; k=pow(i++,j); } } // 查找 sum=0; for(i=1;i<10001;++i) if(no[i]==0) ++sum; cout<<sum<<endl; return 0; } ~~~ ③古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:    ABCDE * ? = EDCBA    他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”    华生:“我猜也是!”    于是,两人沉默了好久,还是没有算出合适的结果来。    请你利用计算机的优势,找到破解的答案。    把 ABCDE 所代表的数字写出来。 一个五位数,乘以一个数得到另一个五位数,而且各位数字是相反的。 从题目中可以提取出的信息: ①相乘前后均为一个五位数 ②这五位数各位数字没有相同的 ③乘的是一个1~9的数字(准确的说是0~9,但是乘以0直接滤了) 我的做法: 设置一个变量Num从10000开始循环到100000,然后乘以1~9后的数传到函数,与原来num判断。 因为是结果填空题,所以就没有怎么优化,判断五个数各不相等,我也只是让第一个数不与后面的数相等。 这样就已经可以筛选的剩下一个了。。。 代码: ~~~ #include <iostream> #include <string.h> using namespace std; int n[5]; void show(int num) { int i,temp; temp=num; for(i=0;i<5;++i) { if(num%10!=n[i]) return; num/=10; } if(n[0]==n[1] || n[0]==n[2] || n[0]==n[3] || n[0]==n[4]) return; cout<<temp<<endl; } int main() { int num,i,k,no; for(num=10000;num<100000;++num) { for(k=1;k<10;++k) { memset(n,0,sizeof(n)); no=k*num; if(no>100000) continue; for(i=4;i>=0;--i) { n[i]=no%10; no/=10; } show(num); } } return 0; } ~~~ ④奇怪的比赛 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 每位选手都有一个起步的分数为10分。 某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗? 如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011就是可能的情况。 你的任务是算出所有可能情况。每个答案占一行。 多个答案顺序不重要。 这道题,可以暴力的。。。用10个变量,for循环。。。 我用的是模拟二进制加法,一直往最后一位加1,再判断各位,如果有等于2的就进位。 一直到下标为0的内容为1,则退出。。 对了,还要注意,题目中讲的是,如果答对该题目,当前拥有的分数翻倍,而不是得到当前题号X2的分数。 代码: ~~~ #include <iostream> using namespace std; int main() { int que[11]={0,0,0,0,0,0,0,0,0,0,0}; int i,j,sum; // 最高位不为1则循环下去 while(que[0]!=1) { // 最低位+1 ++que[10]; // 模拟二进制加法 for(j=10;j>0;--j) if(que[j]==2) { ++que[j-1]; que[j]=0; } // 初始sum为10,并算总分 sum=10; for(j=1;j<11;++j) if(que[j]==1) sum=sum+sum; else sum=sum-j; // 如果最后总分为100,则输出 if(sum==100) { for(j=1;j<11;++j) cout<<que[j]; cout<<endl; } } return 0; } ~~~ ⑤欧拉与鸡蛋 大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。 欧拉随便问:“卖了多少鸡蛋呢?” 不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然我们卖的鸡蛋有多有少,但刚好得了同样的钱数。你猜猜看!” 欧拉猜不出。 另一个补充道:“如果我按她那样的价格卖,可以得到32元;如果她按我的价格卖,可以得到24.5元”。 欧拉想了想,说出了正确答案。 我们不是数学家,懒得列出公式来分析。但计算机可以“暴力破解”,就是把所有可能情况都试验一遍,撞上为止! 请写出每人鸡蛋的数目(顺序不限),用逗号隔开。 一道解一元二次方程的题目,设一个人以a元价格卖了x个鸡蛋,另一个人以b元价格卖了y个鸡蛋。 据题目分析: x+y=150 ax=by bx=32 ay=24.5 就是解这个方程,用笔算的话。。我觉得听麻烦的,还是暴力快点。。。 还要注意一点就是,后面两个也可以是: ax=32 by=24.5 所以,应该有2*n(n为答案个数)的答案。 因为没有确定谁卖了多少个。 代码: ~~~ #include <iostream> using namespace std; int main() { int x,y; for(x=1;x<=150;++x) { y=150-x; if(32*y*y==24.5*x*x) cout<<x<<" "<<y<<endl; if(32*x*x==24.5*y*y) cout<<x<<" "<<y<<endl; } return 0; } ~~~ 蓝桥杯结果填空题,注意一下几点,手算快于机算,就用手算,但是如果用机算,手也不要闲着,多划拉几下。 不要注重代码的优化,因为它只要结果,代码再漂亮人家也看不见,这时间可以用在后面编程大题上。 多注意题目给的线索,一般每个线索都能用上。
';