百灯判息问题
有100盏灯,编号为1到100,分别由相应的100个开关控制。开始时全部开关朝上(朝上为开,灯亮),然后进行以下操作:凡是编号是1的倍数的灯反方向拨一次开关:是2的倍数的灯再反方向拨一次开关:是3的倍数的灯又反方向拨一次开关。。。。。。。,直到是100的倍数的灯又反方向拨一次开关。
算法一:
分析:
1、 先定义一个数组a[101],用来存放灯,a[i]=1表示灯亮,a[i]=-1表示灯灭。
2、利用两重循环,实现题目中的拨动开关操作。数组a的100个元素赋初值为1,
表示开始灯全为亮的状态。外循环变量为k,k:1-100,循环100次,表示拨动
开关的100种方法。内循环为i,i的初值为课,终值为100,按k的倍数拨动开关
。拨动一次开关用a[i]=-a[i]表示。
3、a[i]=-1是输出熄灭状态的灯的编号,并统计灯的数量。
上代码:
#include<stdio.h>
main()
{
int a[101],i,k,n=0;
for(i=1;i<=100;i++)
a[i]=1;
for(k=1;k<=100;k++)
{
for(i=k;i<=100;i+=k)
a[i]=-a[i];
}
printf("熄灭的灯的编号为:\n");
for(i=1;i<=100;i++)
if(a[i]==-1)
{
printf("%4d",i);
n++;
}
printf("\t 共%d盏\n",n);
}
算法二:按完全平方数输出熄灭的灯的编号。
分析:设灯的编号为n,第n号灯需要反向拨动几次开关,就看n有
几个不同的因子。对任意的n,分解出全部不同的因子,包括1和n本身
,有一个因子就表明n号灯反向拨动一次开关。如果n是完全平方数,则它的
因子个数是奇数,n号灯反向拨动奇数次开关,为熄灭状态
上代码:
#include<stdio.h>
#include<math.h>
main()
{
int a[101],i,k,n=0;
for(i=1;i<=100;i++)
a[i]=1;
for(i=1;i<=100;i++)
{
k=sqrt(i);
if(i==k*k)
printf("%d ",i);
n++;
}
printf("\t 共%d盏\n",n);
}