兄弟们来乐乐! (0分)

  • 主题发起人 notnoname
  • 开始时间
N

notnoname

Unregistered / Unconfirmed
GUEST, unregistred user!
同室的朋友用vb,今天他在网上看到一个题目:
一个房间里有100000盏电灯依次编号,开始都是关着的。有100000个人依次编号进入房间后
拉一次他编号的倍数(如2号的人应该拉2、4、6、8...)的灯的开关。求最后有多少灯是开着的。大家分头写程序,我用delphi程序运行了大约9分47秒
算出答案381。vb的程序运行半小时后系统当机。后来我看了一下,我们两的算发一样。
他的机器是塞扬1g,我的是毒龙800
 
哦,题目不太清楚,酸法写来看看
 
var lambcount,peoplecount:integer;
lambstatus:array[1..100000]of Boolean;
begin
time:TDateTime;
begin
begin
Time:=now;
for lambcount:=1 to 100000 do
lambstatus[lambcount]:=false;
for peoplecount:=1 to 100000 do
begin
for lambcount:=1 to 100000 do
begin
if (lambcount mod peoplecount) = 0 then
lambstatus[lambcount] := not lambstatus[lambcount];
end;
end;
for lambcount:=1 to 100000 do
if lambstatus[lambcount] = True then
memo1.Lines.Add(IntToStr(lambcount));
caption:=inttostr(Memo1.Lines.count);
memo1.Lines.Add(TimeToStr(now-begin
time)) ;
end;
 
好啊!!说明delphi好用
 
呵呵,乐也乐也。
独乐乐,不如众乐乐呀
 
程序还有优化的余地!!!!!!!
P4 1.7G 0秒 ,不过答案是 316 !!!!!!!!!!!!!!
procedure TForm1.Button3Click(Sender: TObject);
const n=100000;
var lambcount,peoplecount:integer;
lambstatus:array[1..n]of Boolean;
begin
time:TDateTime;
begin
begin
Time:=now;
for lambcount:=1 to n do
lambstatus[lambcount]:=false;
for peoplecount:=1 to n do
for lambcount:=1 to (n div peoplecount) do
lambstatus[peoplecount*lambcount] :=
not lambstatus[peoplecount*lambcount];
memo1.clear;
for lambcount:=1 to n do
if lambstatus[lambcount] then
memo1.Lines.Add(IntToStr(lambcount));
caption:=inttostr(Memo1.Lines.count);
memo1.Lines.Add(TimeToStr(now-begin
time)) ;
end;
 
结果估计是我记错了,我机器太慢,不想再运行一次了。
你的机器怎么会这么快。羡慕。
 
算法改进了,你看了没有!!!
 
高,jsxjd就是高,的确是0秒
 
jsxjd,能说说原来的算法慢在那里了吗?
 
我的答案也是: 0秒, 316 灯开着! 配置P3 800, 256M内存
procedure TForm1.BitBtn1Click(Sender: TObject);
const H = 100000;
var
Deng : Array[1..H] of Boolean;
I,G : Integer;
Falg : Boolean;
begin
Falg := True;
for I := 1 to H do
begin
if Falg then
Deng := True else
Deng := False;
Falg := Not Falg;
end;

for I:= 3 to H do
begin
G := I;
repeat
Deng[G] := not Deng[G];
G := G+ I;
until G > H;
end;

G:=0;
for I := 1 to H do
begin
if Deng then
G := G+1;
end;
ShowMessage(IntToStr(G));
end;
 
我们的算法基本一致,看来楼主的算法确实有问题。
 
它慢的原因在這儿:if (lambcount mod peoplecount) = 0 要運算
100000*99999*99998...(也就是100000!次)
而后优化了的則是...
 
当然在这儿!
 
我看到了,我的算法当然慢了,多谢指点!~
我当时是和朋友比谁先,更本没考虑优化算法!
 
接受答案了.
 
顶部