[蓝桥杯历届试题]空瓶换汽水; 微生物增殖; 除去次方数
1.空瓶换汽水
浪费可耻,节约光荣。饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料。刚好小明前两天买了2瓶该饮料喝完了,瓶子还在。他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一瓶该饮料,喝完还瓶!!
饮料店老板一统计,已经售出该饮料且未还瓶的有12345瓶,那么如果这些饮料的买主都如小明一样聪明,老板最多还需要送出多少瓶饮料呢?
显然答案是个正整数。
参考答案:
6172
解答:
最多送饮料的情况就是一个人拥有12345个空瓶,然后每次都拿着两个空瓶就去换酒,因为如果拿着三个瓶去换酒的话,你就会少三个空瓶,而前者你会少两个空瓶。所以前者是最最优的。 12345/2
2.微生物增殖
假设有两种微生物 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 种群灭绝的最后一根稻草!
请忍住悲伤,把答案写在“解答.txt”中,不要写在这里!
两个整数,每个1行。
参考答案:
0
94371840
解答:
以半分钟为单位,画图分析一下就可以知道无论是新出生的X还是老的X,它们都是在单位为奇数个的时候吃Y的,这个就是重点啊,自己愣是半天没想出来啊。
代码:
#include <iostream> #include <string.h> using namespace std; int main(int argc, char *argv[]) { int x=10,y=89; for(int i=1;i<=120;i++) { if(i%6==0) x*=2; if(i%4==0) y*=2; if(i%2==1) y-=x; if(y<=0) { y=0; break; } } cout<<x<<" "<<y<<endl; return 0; }
3.除去次方数。
自然数的平方数是:1 4 9 16 25 …
自然数的立方数是:1 8 27 64 125 …
自然数的4次方数是:1 16 81 256 …
…
这些数字都可以称为次方数。
1~10000中,去掉所有的次方数,还剩下多少个数字?
参考答案:
9875
解答:
暴力搜。注意退出条件。用一个10000的数组来保存状态。
代码:
#include <iostream> #include <string.h> #include <cmath> using namespace std; long long cifang(int i,int j)//计算i的j次方 { long long sum=i; for(int k=2;k<=j;k++) sum*=i; return sum; } int a[10001]; int main(int argc, char *argv[]) { a[1]=1; int i=2,j=1; memset(a,0,sizeof(a)); for(i;cifang(i,j)<=10000;i++) { for(j;cifang(i,j)<=10000;j++) { a[cifang(i,j)]=1; } j=2;//注意这一句。对于每个i都从2次方开始。千万别忘了这一句。 } int count=0; for(int i=1;i<=10000;i++) if(a[i]==0) count++; cout<<count<<endl; return 0; }