问题描述:狱吏问题;某国王对囚犯进行大赦,让一狱吏n次通过一排锁着的n间牢房,每通过一次按所定规则转动n间牢房中的某些门锁,每转动一次原来锁着的被打开,原来打开的被 锁上通过n次后,门锁开着的,牢房中的犯人被放出,否则,犯人不得释放。
转动门锁的规则是这样的,第一次通过牢房,从第一间开始转动每一把锁,即把全部锁打开;第二次通过牢房时,从第二间开始,每隔一间转动一次;……;第k次通过牢房,第k间开始转动,每隔k-1 间转动一次;问经过n次后,那些牢房的锁依然是开着的。
源代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0;
int i = 0;
int j = 0;
int* p = NULL;
scanf("%d", &n);
//开辟存储空间
p = (int *)calloc(n + 1, sizeof(int));
for (i = 1; i <= n; i++)
{
//将锁的状态初始化为关闭,1表示锁上,0表示打开
p[i] = 1;
}
//i表示通过牢房的次数,j表示要转动的锁的编号
for (i = 1; i <= n; i++)
{
for (j = i; j <= n; j += i)
{
//切换锁的状态
p[j] = 1 - p[j];
}
}
for (i = 1; i <= n; i++)
{
if (p[i] == 0)
{
printf("%d is free \n", i);
}
}
free(p);
return 0;
}