百灯判熄--数组元素变号代替开关_wangzifdba_新浪博客

    问题:有一百盏灯,编号1~100,分别对应100个开关控制。开始全部朝上(表示开,朝下表示关),然后进行以下操作:编号为1的倍数的反方向拨开关,编号为2的倍数的反方向拨开关******编号为100的反方向拨一次开关;问{zh1}各灯的状态。

算法1:

    分析:建立一个数组a[101],a[0]不使用,用a[i]表示第i个灯,1<=i<=100,当a[i]=1时表示灯亮,a[i]=-1表示灯熄。可以做一个两重循环,外循环k(1-100)标记第几次拨开关,内循环看比k大的数中是不是k的倍数,也就是说是否需要拨开关。{zh1}输出结果,程序如下:

#include<iostream>
using namespace std;
int main()
{
    int a[101],i,k=1,n=0;
    for(i=1;i<=100;i++)
       a[i]=1;
    for(i=k;k<=100;k++)
    for(i=k;i<=100;i+=k)
       a[i]=-a[i];
    for(i=1;i<=100;i++)
    {
        if(a[i]==1)
             cout<<"第"<<i<<"个灯是亮的"<<endl;
        else
             cout<<"第"<<i<<"个灯是灭的"<<endl;
    }
    return 0;
}

算法二:

    在算法一中,我们使用了双循环,可以说是比较复杂的,在编程过程中要尽可能少使用for和while等函数,尤其是多重循环函数,因为计算量是曾几何倍数增加的。在这个题中xx可以避开双循环。

分析:重新分析题目,“编号为1的倍数的反方向拨开关,编号为2的倍数的反方向拨开关******编号为100的反方向拨一次开关”,这句话的意思用另一个方向理解的是第i个灯拨弄几次开关直接和它的因子个数有关,每拨动两次就回到原状态,也就说偶数个因子时,{zh1}的状态时亮的,奇数个因子时,{zh1}的状态时熄灭的。然后回到数论中对于一个整数k,有多少个因子呢?如果k是xx平方数,那它有奇数个因子,否则有偶数个因子。

于是编程时,可以改变双循环为:

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int a[101],i,k=1,n=0;
    for(i=1;i<=100;i++)
        a[i]=1;
    for(i=1;i<=100;i++)
    {
        k=sqrt(i);
        if(i==k*k)
             cout<<"第"<<i<<"个灯是熄灭的"<<endl;
        else
             cout<<"第"<<i<<"个灯是亮的"<<endl;
     }
     return 0;
}

事实上,程序还可以更加简化,用下面一段替换:

for(i=1;i<=sqrt(100);i++)

    cout<<"第"<<i*i<<"个灯是熄灭的"<<endl;

 

那为什么xx平方数有奇数个因子?

已投稿到:
郑重声明:资讯 【百灯判熄--数组元素变号代替开关_wangzifdba_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——