枚举法----狱吏问题(C语言描述)

来源:互联网 发布:ppp项目数据库app 编辑:程序博客网 时间:2024/05/06 14:59

问题描述:

某王国对囚犯进行大赦,让一狱吏n次通过一排锁着的n间牢房,每通过一次按所定规则转动门锁,每转动一次,原来锁着的被打开,原来打开的被锁上;通过n次后,门锁开着的,牢房中的犯人放出,否则犯人不得获释.转动门锁的规则是这样的,第一次通过牢房,要转动每一把门锁,即把全部锁打开;第二次通过牢房时,从第二间开始转动,每隔一间转动一次;第k次通过牢房,从第k间开始转动,每隔k-1 间转动一次;问通过n次后,那些牢房的锁仍然是打开的?


问题分析:

狱吏问题其实就是一个数学问题,当且仅当n为完全平方数时,n的因子个数为奇数,只需要找到小于n的完全平方数即可!


代码如下:


#include "stdio.h"#include "math.h"int warder(int n){    int a[256];    int i,j=0,temp;    for(i=1;i<=n;i++){temp=(int)sqrt((float)i);if(!(temp*temp-i))            a[j++]=i;    }    for(i=0;i<j;i++){        printf("%d is free\n",a[i]);    }}void main(){    int n;    printf("请输入n的值:");    scanf("%d",&n);    warder(n);}



运行结果:



0 0
原创粉丝点击