题目描述
特工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