안녕하세요?
한델 이정욱 입니다~
심심해서 이벤트 한번 해봅니다 ~
참여하시는 분들 중 1등(200),2(100),3(50) 등게세 한델 포인트 총 350점을 드리겠습니다.
현재 포인트를 많이 가지고 계신분이 없으셔서 더 많은 포인트를 드리기가 뭐 해서 이정도 드립니다. ^^
대신 간단한 퀴즈로 할께요~
퀴즈~
for 문과 while 문 그리고 repeat 문을 사용하여 1 부터 10000 까지 더하여 writeln 으로 출력하는 코드를 작성해주세요. 단, 1 부터 5000까지는 for문을 이용하여, 5001 부터 8000까지는 while문을 이용하여, 8001부터 10000까지는 repeat문을 이용하여 작성해주세요.
1,2,3 등을 정하는 기준은 그 코드를 가지고 같은 PC에서 가장 빠른 속도를 내는 코드를 기준으로 하겠습니다.
많은 참여 부탁드리겠습니다~
감사합니다.
음 재미 있겠네요. 댓글로 달면 아무래도 보고하게 될꺼 같은데.. ㅡ_ㅡ+
그냥 이곳에 댓글로 달아도 되죠 ^^ 어차피 같은 코드면 먼저 올린사람이 우선이니까요~
ㅎㅎ 하긴 그렇네요. ^^
// 더 최적화 하는 게 의미가 없어 보여서 그냥 기본(?)에 충실하게 올립니다. ^^
// 음 루프 자체를 지정해 주셔서 인라인 어셈을 쓸수도 없고 음냐... 역시 실력이 부족한거 같네요. ㅠ_ㅠ
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils, MMSystem;
procedure TestLoop;
var
i : Integer;
sum : LongInt;
begin
sum := 0;
for i:=1 to 5000 do Inc(sum, i);
while i <= 8000 do
begin
Inc(sum, i);
inc(i);
end;
repeat
Inc(sum, i);
Inc(i);
until(i > 10000);
Writeln(IntToStr(sum));
end;
begin
TestLoop;
Readln;
end.
집에가서 해봐야겠군요.... 그래도 가장 일반적인 답변이 이미 나와서... 어떻게 바꿀까 고민 좀 해야 겠네요.
보통 1~N 까지의 합은 N*(N+1)/2 로 계산하면 나오는데요. 이걸 루프문으로 어떻게 빨리 돌릴까 생각하니..
개인적으로 플밍 실력이 딸리는지라.. 꽁수(?)를 써서.. 반절만 돌리게 아래와 같이하는건 반칙이겠죠 ㅡㅡ''
var
i : integer;
min_num, max_num : Integer;
sum_num : integer;
avg_num : integer;
begin
sum_num := 0;
min_num := 1;
max_num := 5000;
avg_num := min_num + max_num;
for i:= 1 to (max_num - (min_num-1)) div 2 do
inc(sum_num, avg_num);
//memo1.lines.add('~5000 :' + inttostr(sum_num) + ' ' + inttostr(avg_num) + ' ' + inttostr((max_num - min_num-1) div 2) );
min_num := 5001;
max_num := 8000;
avg_num := min_num + max_num;
i := 1;
while i <= (max_num - (min_num -1)) div 2 do begin
inc(sum_num, avg_num);
inc(i);
end;
//memo1.lines.add('~8000 :' + inttostr(sum_num) + ' ' + inttostr(avg_num) + ' ' + inttostr((max_num - (min_num -1)) div 2 ));
min_num := 8001;
max_num := 10000;
avg_num := min_num + max_num;
i := 1;
repeat
inc(sum_num, avg_num);
inc(i);
until (i > (max_num - (min_num -1)) div 2);
//memo1.lines.add('~10000 :' + inttostr(sum_num) + ' ' + inttostr(avg_num) + ' ' + inttostr((max_num - (min_num -1)) div 2) );
showmessage(inttostr(sum_num));
아 공식이 있군요..-.-a 멋지네영..저런수가 있었다니...ㄷㄷㄷ
저도 루프를 반으로 줄여서 해봤는데...시간단축이 영 시원찮아서 -.-;;; 게다가 본문제와는 상관(?)없는거지만은 max_num 이 홀수가 된다면... orz... 돼서...ㅋㅋ 머...당연한건가? ㅋ
네.. 홀수가 나오면 쫌 그렇죠. 하지만.. 조건이 주어진상태라.. 조건에 충실하고자 했음.
실력을 환경으로 돌리는 ㅡㅡ''
그나저나 치코님 스타일로 하나 작성해 볼까 ㅎㅎ
사실 내부 루프에 더하기 몇개 더 넣어주는 신공을 하면 아주 조금은 빨라지지만 음 의미가 있을지 ㅡ_ㅡ;;
그리고 요즘 같이 멀티 코어이면 사실 루프를 나누어서 따로 돌리는 게 빠를텐데 델파이가 멀티코어를 지원하나요 ?
그걸 모르겠네요. ㅠ_ㅠ
일단은 소나기님하고, 용일님이 1,2등 드시고, 접수자가 저까지 딱 3명만 되면.. 꽁수라도.. 3등 50점 주시겠죠 ㅡㅡ''
program Project3; {$APPTYPE CONSOLE} uses SysUtils, Classes; type TForThread = class(TThread) Public Sum : Integer; private { Private declarations } protected procedure Execute; override; end; TWhileThread = class(TThread) Public Sum : Integer; private { Private declarations } protected procedure Execute; override; end; TrepeatThread = class(TThread) Public Sum : Integer; private { Private declarations } protected procedure Execute; override; end; { TForThread } procedure TForThread.Execute; var i : Integer; begin inherited; Sum :=0; for i := 0 to 5000 do Inc(Sum, i); Terminate; end; { TWhileThread } procedure TWhileThread.Execute; var i : Integer; begin inherited; i := 5001; Sum :=0; while i <= 8000 do begin Inc(Sum, i); inc(i); end; Terminate; end; { TRepeatThread } procedure TrepeatThread.Execute; var i : Integer; begin inherited; Sum :=0; i := 8001; repeat Inc(Sum, i); Inc(i); until(i > 10000); Terminate; end; var Thread1 : TForThread; Thread2 : TWhileThread; Thread3 : TrepeatThread; begin Thread1 := TForThread.Create(False); Thread2 := TWhileThread.Create(False); Thread3 := TrepeatThread.Create(False); repeat until (Thread1.Terminated and Thread2.Terminated and Thread3.Terminated); Writeln(IntToStr(Thread1.Sum + Thread2.Sum + Thread3.Sum)); Readln; end.
그냥 심심해서 간단하게 테스트 하나 더 해봤습니다.
그냥 마구 짠거라 뭐라고 하지는 마시고요. 음 역씨 멀티 코어라 쓰레드로 구성해서 돌리니 빠르네요.
음 100000 번 돌리니 1초 정도 차이 나네요.
헉 쓰레드 좋다..
소나기님과 치꼬님 각각 200, 150 점 씩 드렸습니다~
감사합니다. 꾸뻑
그나저나 참여율이 저조해서 ㅠ_ㅠ
이정욱님이 애쓰시는 모습이 보이는 데 다들 좀 분발합시다.. 아자 아자 ^^
엇... 참여점수 감사 ㅡㅡ''
재미있는 이벤트네요...
제출은 어떻게 언제까지 하나요? 코드만 올리나요?