Locker doors(带锁的门)
题目大意:在走廊上有n个带锁的门,从1到n依次编号。最初所有的门都是关着的。我们从门前经过n次,每一次都从1号门开始。在第i 次经过时(i=1,2,..., n)我们改变i的整数倍号锁的状态:也就是如果门是关的,就打开它;如果门是打开的,就关上它。举例来说,第一次经过后,所有的门都是打开的;第二次经过 后,偶数门是关着的,奇数门是开着的;以此类推,在最后一次经过后,有多少门是开着的。
提示:门的状态只有两 种,每经过一次,状态就会发生变化。如果一道门经过奇数次,那么结果状态和原始状态就会不一样,而经过偶数次则不会发生变化。因此问题的关键就是找出那些 经过奇数次的门有多少道。很幸运,那些门的编号正好是整数i的完全平方数即1,4,9,16,...,因此只需要找出这样的数字有多少个即可。
问题分析:先用5个门来做一下结果测试,问题的过程和结果如下:
一 二 三 四 五
一 1 1 1 1 1
二 1 0 1 0 1
三 1 0 0 0 1
四 1 0 0 1 1
五 1 0 0 0 0
可以发现对角线上的数字就是最后门打开的情况,正好是i的平方数
问题结论的验证代码如下:
#include <stdio.h>
#define N 1000
int main()
{
int L[N];
int i,j,k;
int n;
printf("请输入小于1000的整数代表门的总数:");
while(1)
{
scanf("%d",&n);
if(n<0||n>1000)
printf("输入错误,请重新输入");
else break;
}
for(i=0;i<n;i++)
L[i]=0;
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(k%j==0)
L[k-1]=(L[k-1]+1)%2;
for(i=0;i<n;i++)
{
if(L[i]==1)
printf("第%d号门开着\n",i+1);
}
printf("\n");
return 0;
}
最后输出结果为:
由程序运算结果可以看出最后打开的门的编号是i的二次方。