今天在看雪看到这个“猫吃老鼠问题”的帖子,和当初学编程时的一个叫做“约瑟夫环问题”类似。
自己按照数学的方法分析了一下,得到一个数学算法。
问题描述:
现有n个老鼠围成一圆圈,有一只猫从任意位置开始吃老鼠,每次都隔一个老鼠吃,请给出最后一个老鼠的编号?题目要求是任给老鼠数n,输出猫最后吃的老鼠的编号。
数学算法
//若从1号算起
int total = 1;
int seed = 1;
printf("老鼠个数?/n");
scanf("%d",&total);
while(seed < total) seed<<=1;
printf("最后一个吃掉的是:%d/n",2*total-seed);
若从任意号算起,只要在此基础上加入一个计算偏移量的代码即可。
分析图示:
1 | ||||||||||||||||
1:01 | 1 | |||||||||||||||
2:02 | 1 | 2 | ||||||||||||||
2 | ||||||||||||||||
3:02 | 1 | 2 | 3 | |||||||||||||
2 | ||||||||||||||||
4:04 | 1 | 2 | 3 | 4 | ||||||||||||
2 | 4 | |||||||||||||||
4 | ||||||||||||||||
5:02 | 1 | 2 | 3 | 4 | 5 | |||||||||||
2 | 4 | |||||||||||||||
< |