百灯熄灭问题--数组的应用

                       百灯判息问题


有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);
}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值