一、 微生物增殖
假设有两种微生物 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”中,不要写在这里!
答案:0和 94371840
#include<stdio.h>
int fun(int x, int y) {
int t;
for(t=1;t<=120;t++) {
if(t%2==1) {
y-=x;
if(y<0) {
y=0;
break;
}
}
if(t%4==0) y*=2;
if(t%6==0) x*=2;
}
return y;
}
int main() {
printf("%d\n",fun(10,89));
printf("%d\n",fun(10,90));
system("pause");
return 0;
}
二、古堡算式
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE所代表的数字写出来。
#include<stdio.h>
#include<string.h>
#define N 5
int num[N],visited[10];
int getNum1(){
int sum,i,p;
for(i=sum=0,p=1;i<N;i++) {
sum+=num[i]*p;
p*=10;
}
return sum;
}
int getNum2(){
int sum,i,p;
for(i=N-1,sum=0,p=1;i>=0;i--) {
sum+=num[i]*p;
p*=10;
}
return sum;
}
void fun(int n) {
int i,num1,num2;
if(n>=N) {
num1=getNum1();
num2=getNum2();
for(i=0;i<=9;i++) {
if(num1*i==num2) {
printf("%d*%d=%d\n",num1,i,num2);
}
}
return;
}
for(i=0;i<=9;i++) {
if(visited[i]==0) {
visited[i]=1;
num[n]=i;
fun(n+1);
visited[i]=0;
}
}
}
int main() {//采用递归枚举
memset(visited,0,sizeof(visited));
fun(0);
system("pause");
return 0;
}
三、比酒量
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复......直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
#include<stdio.h>
#include<string.h>
#define N 4
int p[N+2];
void fun(int cur,int k, double sum) {
int i;
if(cur==N) {
if(sum==1) {
for(i=0;i<N;i++) {
printf("%d,",p[i]);
}
printf("0\n");
}
return ;
}
for(i=k-1;i>=1;i--) {
p[cur]=i;
fun(cur+1,i,sum+1.0/i);
}
}
int main() {
fun(0,21,0);
system("pause");
return 0;
}
四、奇怪的比赛
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
#include<stdio.h>
#include<string.h>
#define N 10
int num[N];
void fun(int n,int sum) {
int i;
if(n>=N) {
if(sum==100){
for(i=0;i<N;i++)
printf("%d",num[i]);
printf("\n");
}
return;
}
for(i=0;i<=1;i++) {
num[n]=i;
if(i==0) fun(n+1,sum*2);
else fun(n+1,sum-i);
}
}
int main() {
fun(0,10);
system("pause");
return 0;
}
五、转方阵
对一个方阵转置,就是把原来的行号变列号,原来的列号变行号
例如,如下的方阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
转置后变为: