主题:(经典)编程:计算灯的开关状态
imdwpeng
[专家分:50] 发布于 2007-10-16 20:43:00
有N个灯放在一排,从1到N依次顺序编号.有N个人也从1到N依次编号.1号将灯全部关闭,2号将凡是2的倍数的灯打开;3号将凡是3的倍数的灯作相反处理(该灯如果打开则将它关闭;如关闭则打开).以后的和3号一样,将凡是自己编号倍数的灯作相反处理.试计算第N个操作后,哪几盏灯是亮的.(0-表示灯开着, 1-表示灯关闭).
[em16]
回复列表 (共9个回复)
沙发
Recker1 [专家分:480] 发布于 2007-11-03 21:38:00
你再试试吧,不难。说出来就没意思了
板凳
llyy1166 [专家分:10] 发布于 2007-11-10 07:55:00
做循环。。。
3 楼
llyy1166 [专家分:10] 发布于 2007-11-10 07:56:00
逐个开关灯。。。
4 楼
BZin [专家分:30] 发布于 2007-11-15 20:37:00
入门级。
5 楼
kenvi [专家分:0] 发布于 2008-01-14 21:46:00
1 4 9 25 n的平方
6 楼
zuoxu128 [专家分:20] 发布于 2008-04-18 14:53:00
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 楼
老大徒伤悲 [专家分:29120] 发布于 2008-06-17 16:43:00
实际上,这个不用程序。
凡是被操作“偶数”次的都是原状,其余被改变。
一个数分解成乘积,总有乘数熟和被乘数
当乘数与被乘数不等时,被操作两次
相等时操作只有一次
所以,有5楼kenvi的结论。
我同意。
8 楼
老大徒伤悲 [专家分:29120] 发布于 2008-08-01 19:18:00
张先生(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 楼
seepath [专家分:0] 发布于 2008-10-01 20:19:00
有那么复杂吗?
Program tryy;
var
a:qword;
begin
Read(a);
Writeln(trunc(sqrt(a)));
end.
我来回复