C语言病毒变异问题案例

题目描述

特工770正在调查一种神秘的病毒,感染这种病毒的人有几率会在每天睡梦里梦见一只可爱的很胖的猫咪。770发现,病毒有1种初始状态,还有6天的潜伏期,在此期间每天每种状态会同时发生下述两种变异,产生两种新状态,同时旧的状态会全部消失。请注意,这两种新状态在次日会各自变异,产生2×2=4种新状态,以此类推。当潜伏期结束后,如果最后一天变异产生的状态中,存在一个状态满足下述条件,那么这个人就会开始梦见猫咪。现在特工770要求你编写一个程序,输入病毒的初始状态,计算潜伏期结束后感染者是否会开始梦见猫咪。

变异规则

病毒状态是一个unsigned int,记为V;病毒已变异次数记为T;
左移变异:若((1<<31)&V)!=0,则V左移T位产生新状态,否则V左移1位产生新状态;
右移变异:若(1&V)!=0,则V右移T位产生新状态,否则V右移1位产生新状态。

梦见猫咪的条件

记常量0x0003C000为M,若最后一天变异产生的某个状态V满足((V&M)^M)==0,则感染者会开始梦见猫咪,请输出yes;否则,感染者不会开始梦见猫咪,请输出no。

Input

一个整数,最小值是0,最大值是pow(2, 32)-1,代表病毒的初始状态。

Output

判断梦见猫咪的条件,输出yes或no(带换行)。

案例代码

#include <stdio.h>
#include <math.h>

unsigned int leftShiftMutation(unsigned int V, int T) {
    if ((1 << 31) & V) {
        return V << T;
    } else {
        return V << 1;
    }
}

unsigned int rightShiftMutation(unsigned int V, int T) {
    if (1 & V) {
        return V >> T;
    } else {
        return V >> 1;
    }
}

int isDreamCat(unsigned int V, int T) {
    const unsigned int M = 0x0003C000;
    if (T == 0) {
        return ((V & M) ^ M) == 0;
    } else {
        unsigned int mutatedV1 = leftShiftMutation(V, T);
        unsigned int mutatedV2 = rightShiftMutation(V, T);
        return isDreamCat(mutatedV1 | mutatedV2, T - 1);
    }
}

int main() {
    unsigned int initialV;

    printf("请输入病毒的初始状态:");
    scanf("%u", &initialV);

    if (isDreamCat(initialV, 6)) {
        printf("yes\n");
    } else {
        printf("no\n");
    }

    return 0;
}

在这个程序中,我们定义了一个递归函数isDreamCat来判断是否满足梦见猫咪的条件。在isDreamCat函数中,我们根据潜伏期的天数递归地进行状态的变异,并在最后一天判断是否满足条件。

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享