回 帖 发 新 帖 刷新版面

主题:(经典)编程:计算灯的开关状态

有N个灯放在一排,从1到N依次顺序编号.有N个人也从1到N依次编号.1号将灯全部关闭,2号将凡是2的倍数的灯打开;3号将凡是3的倍数的灯作相反处理(该灯如果打开则将它关闭;如关闭则打开).以后的和3号一样,将凡是自己编号倍数的灯作相反处理.试计算第N个操作后,哪几盏灯是亮的.(0-表示灯开着, 1-表示灯关闭).
                          [em16]

回复列表 (共9个回复)

沙发

你再试试吧,不难。说出来就没意思了

板凳


做循环。。。

3 楼

逐个开关灯。。。

4 楼

入门级。

5 楼


 1 4 9 25 n的平方

6 楼

public  void printl(int[] a){
        int n=a.length-1;
        for(int i=1;i<=n;i++)
        {
           for(int j=i;j<=n;j++)
          {
             if(j%i==0){
                if(a[j]==0){
                 a[j]=1;
                }else{
                a[j]=0;
                }
             }

          }
        }
    }

效率高不高我没有测试哈,自己看看还有没有什么更好的算法。

7 楼

实际上,这个不用程序。
凡是被操作“偶数”次的都是原状,其余被改变。
一个数分解成乘积,总有乘数熟和被乘数
当乘数与被乘数不等时,被操作两次
相等时操作只有一次

所以,有5楼kenvi的结论。
我同意。

8 楼

张先生(Jimmy):
    你好,首先感谢你对知识的执著和对我的信任。
    因为时间很久了,原题我记不太清,仅凭记忆和猜测解答如下。如有不对的地方,欢迎来信讨论。
    第一、为什么要分解为“乘积”而不是加法、减法、或者除法?这是因为题目规定,凡是可以整除的菜可以按动开关。所以用乘法(或者说除法);生发和除法实际上是一回事,表述为乘法更方便一点。
    第二、关于分解成什么与什么的乘积的问题。例如4号开关会被按动几次呢?显然,编号为1的人、为2的人和为4的人都回去按动开关的,也就是说是3次。其中,1和4时一对,2时单独的,所以为单数次,开关状态被改变(即1*4、2*2)。再例如90号,按动它的人的编号分别为:1、2、3、5、6、9、10、15、18、30、45、90。用乘法来表达,就是1*90、2*45、3*30、5*18、6*15、9*10,共6对,结果回归原状,状态没有改变。
    所以,凡是编号为一格整数的平方,其按动次数为单数,状态改变;否则按动双数次,状态没有改变。
    祝你进步!
 
 
 
老大徒伤悲
2008-8-1 

这本来是给Jimmy写的邮件,但邮箱发不出去,就先贴在这里吧(也不知道是不是楼主?或者是别的朋友)。

9 楼

有那么复杂吗?
Program tryy;
var
 a:qword;
begin
 Read(a);
Writeln(trunc(sqrt(a)));
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册