C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[754] [Algorithm] 연속된 수 덧셈 빨리하기..
장성호 [nasilso] 10893 읽음    2008-03-11 11:59
연속된 수 덧셈 빨리하기..

다 아는것 같은데  그냥 한번 정리해 봅니다.

1. 1에서 100까지 더하기는?

  1.1 단순한 방법
   void __fastcall TForm1::Button3Click(TObject *Sender)
   {
       int sum=0;
       for(int i=1;i<=100;i++)
           sum+=i;
       ShowMessage(sum);
   }
   가장 단순한 방법은 위와같이 for문을 돌려서 구하면 되겠죠!

  1.2 빨리 더하기..
      간단하게 빨리하려면  다음과 같이 하면 됩니다.  
      sum=(100*101)/2 ;
     
     왜그럴까요?
     아래와같이 숫자를 나열해보면      
    
     -------------------------------
     1   +   2 +   3 + ... + 50 +
     100 +  99 +  98 + ... + 51
     -------------------------------
   = 101 + 101 + 101 + ... + 101

     101의 갯수가 50개가 되죠?
     즉 101*50이 됩니다.
    
     숫자 n에 대하여 서술하면
 
     sum = n * (n+1 ) / 2 가 됩니다.


2.  m 에서 n까지 더하기는?   ( 조건 m<n, m>1 )

    위에 1.2를 응용해서 아래와 같이 정리될것입니다.
   
        sum = n! - (m-1)!
        = n * (n+1 ) / 2     - m * (m-1 ) / 2 ;

       예) 11부터 100까지 덧샘은?
          sum = 100*101/2  -  10*11/2   ;

3. 그럼 1에서 n까지  m의 배수만 더하기(예 1~100까지 3의 배수만 더하기)는? 
    (조건 m < n )

    보통 아래와같이 계산하겠죠?
    int sum=0;
    for(int i=3;i<=100;i+=3)sum+=i;

    근데 이것도 1.2의 식을 응용해서 아래와 같이 정리할 수 있습니다.
    max = n - n % m ;  //m의 배수중 제일큰 수   
    sum =(max*(max+1)+max*(m-1))/(2*m);

    mas = 100 - 100 % 3 = 99 ;
    sum =(  99 * 100  +  99 * (3-1) ) /( 2 * 3 )      ;
    쪼금 식이 복잡한데 잘 풀어보면 금방 이해하실수 있을것 입니다.


   왠만한 경우에 그냥  for문 돌려도 별문제 없습니다.


그럼..
초보대왕 [sauron]   2008-03-11 12:55 X
2 번이 수학자 가우스가 어렸을 때 사용했던 방법이죠..

+ -

관련 글 리스트
754 [Algorithm] 연속된 수 덧셈 빨리하기.. 장성호 10893 2008/03/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.