蓝桥杯-结果填空题

微生物增殖—除去次方数—古堡算式—奇怪的比赛—欧拉与鸡蛋

①微生物增殖

假设有两种微生物 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。

可以画一个时间轴来更清晰的表示出来:

我们可以很清晰的看出,红蓝点会重合,也就是新生的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;
}

蓝桥杯结果填空题,注意一下几点,手算快于机算,就用手算,但是如果用机算,手也不要闲着,多划拉几下。
不要注重代码的优化,因为它只要结果,代码再漂亮人家也看不见,这时间可以用在后面编程大题上。

多注意题目给的线索,一般每个线索都能用上。

文章导航