2012(1)
假设有两种微生物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”中,不要写在这里!(循环)
2012(2)
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:ABCDE * ? = EDCBA。他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”华生:“我猜也是!”于是,两人沉默了好久,还是没有算出合适的结果来。请你利用计算机的优势,到破解的答案。把 ABCDE 所代表的数字写出来。
答案写在“解答.txt”中,不要写在这里!(循环、递归)
2012(3)
有一海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”。请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。如果有多个可能的答案,请列出所有答案,每个答案占一行。格式是:人数,人数,...例如,有一种可能是:20,5,4,2,0。答案写在“解答.txt”中,不要写在这里!(循环、递归)
#include <stdio.h>
void main()
{
    int i,j,k,l;
    for(i=4;i<21;i++)
    {
        for(j=3;j<i;j++)
        {
            for(k=2;k<j;k++)
            {
                for(l=1;l<k;l++)
                {
                    if(i*j*k+i*j*l+i*k*l+k*j*l==i*k*j*l)
                        printf("%d,%d,%d,%d,0\n",i,j,k,l);
                }
            }
        }
    }
}
2012(4)
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。答案写在“解答.txt”中,不要写在这里!(递归)
#include <stdio.h>
void f(int n,int k,char *s)
{
    char g[11];
    int i;
    for(i=0;i<12;i++)
    {
        g[i]=s[i];
    }
    if(k==10)
    {
字符串函数详解        if(n==100) //k10时全部答完,检查总分是不是100,不要忘了return
        {
            printf("%s\n",g);
            return;
        }
        else
            return;
    }
    g[k]='1';
    f(2*n,k+1,g); //答对,g为答题记录
    g[k]='0';
    f(n-k-1,k+1,g);//答错
}
void main()
{
    char s[11]={'0','0','0','0','0','0','0','0','0','0','\0'};//用来记录答题结果
    f(10,0,s);
}
2012(5)
    对一个方阵转置,就是把原来的行号变列号,原来的列号变行号
    例如,如下的方阵:
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;
}
请分析代码逻辑,并推测划线处的代码。
2012(6)
    对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。
    如图【1.jpg】表示了分块乘法的原理。可以把大数分成多段(此处为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;
}
请分析代码逻辑,并推测划线处的代码。
2012(7)
    今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子。我们希望推算出所有可能的放法。下面的代码就实现了这个功能。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。