ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘/C언어] 수열의 합 알고리즘(3) / 계차수열의 합 (정보처리기사, 실기)
    Algorithm 2019. 5. 20. 13:27

    1. Sum= 2 + 3 + 5 + 8 + 12 + ... +(NUM항)의 합

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int cnt, sum = 2, i = 2 , j = 0;
    	for (cnt = 1; cnt < NUM; cnt++) {
    		j = j + 1;
    		i = i + j;
    		sum = sum + i;
    		printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    위 수열은 1씩 증가하는 숫자를 더한 숫자들을 누적해서 더하는 수열이다.

    그러니까 변수가 3개가 필요하다.

     

    1씩 증가하는 숫자를 담을 변수, j

    자기 자신에 j를 더하여 커지는 숫자, i

    i를 누적해서 더한 값을 담은 sum

     

    그래서 j에는 1을 더하고, i에는 그 j를 더하고, sum에 i를 더해야 한다.

     

    이 수열의 첫번째 더해야할 값은 2인데, sum이 이미 2를 가지고 있다.

    그러면 가장 최초로 더해야할 값은 3이 되기 때문에

    초기값 j는 0, i는 2가 되어야 j = j + 1 (j가 1이 됨) → i = i + j (i가 3이 됨)

    이 순서로 연산되어 3을 더하게 된다.

     

    이미 2를 sum이 가지고 있으므로 3부터 9번 더해야한다.

    그러므로 cnt변수는 1부터 시작하여 NUM보다 작을 때까지 더한다. (1부터 9까지)

     

    위 코드에서 j와 i연산을 sum 연산 전에 하고 있다. (선증가 후처리 type A)

    그러므로 반복문이 다 끝난 이후 cnt는 10, j는 9이다.

    (sum이 2를 이미 가지고 있어서 9번 돌렸으므로)

     

     

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int cnt, sum = 0, i = 2, j = 0;
    	for (cnt = 1; cnt <= NUM; cnt++) {
    		sum = sum + i;
    		printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    		j = j + 1;
    		i = i + j;
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    이번엔 sum의 초기값이 0이기 때문에 2부터 10번 더해야한다.

    그러므로 cnt의 초기 값은 1이고 NUM보다 작거나 같을때까지 더해야 한다. (1부터 10까지)

     

    최초로 더하는 i의 값이 2가 되어야 하므로 i의 초기값은 2가 된다.

    sum 연산 끝난 후 j에 1을 더하고 그 j를 i에 더해서 3을 만들어야 하므로 j의 초기값은 0이 된다.

     

    그리고 이 코드는 위에서 본 코드와 다르게 선처리 후증가(type B) 방식이다.

    j = j + 1; i = i + j; 연산을 sum 연산 뒤에 처리하고 있다.

    그러므로 반복문이 다 끝난 이후 cnt의 값은 11, j의 값은 10이다.

    (10번 연산하는데, cnt의 초기값은 1이었으므로 11, j의 초기값은 0이었으므로 10)

     

     

     

    1. Sum= 1 + 2 + 4 + 7 + 11 + ... +(NUM항)의 합

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int cnt, sum = 1, i = 1 , j = 0;
    	for (cnt = 1; cnt < NUM; cnt++) {
    		j = j + 1;
    		i = i + j;
    		sum = sum + i;
    		printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    아까와 똑같은 규칙인데, 단지 2가 아닌 1부터 시작한다는 점이 다른 수열이다.

    아까와 똑같이 코드를 작성하면 되지만 초기값만 신경써주면 된다.

    sum의 초기값은 1이므로 cnt는 1부터 NUM보다 작을 때까지 반복을 하고

    i의 초기값은 1, j는 0이 되어야 한다.

     

     

     

    1. Sum= 1 + 3 + 6 + 10 + 15 + ... +(NUM항)의 합

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int  cnt, sum = 1, i = 1, j = 1;
    	for (cnt = 1; cnt < NUM; cnt++) {
    		j = j + 1;
    		i = i + j;
    		sum = sum + i;
    		printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    아까와 똑같은 규칙이지만 j가 1이 아닌 2부터 시작한다는 점이 다르다.

    위에서 작성한 코드 아무거나 복붙한 다음에 초기값만 살짝 고쳐주면 된다.

     

    sum의 초기값을 1로 잡으면 3부터 더하는 셈이 된다.

    만약 i의 초기값이 1이라면 j의 초기값 또한 1이 된다.

    j에 1을 더해 2가 되고 그 2를 i에 더해 3이 되어야 하기 때문이다.

     

     

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int  cnt, sum = 0, i = 0, j = 0;
    	for (cnt = 1; cnt <= NUM; cnt++) {
    		j = j + 1;
    		i = i + j;
    		sum = sum + i;
    		printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    만약 위 코드에 sum의 초기값을 0으로 둔다면 이제 1부터 10번 풀로 반복을 해야하므로

    조건문이 cnt = 1; cnt <= NUM;이 되어야 한다. (혹은 cnt = 0; cnt < NUM;으로 하거나)

     

    가장 먼저 더해야하는 값이 1이므로 i와 j의 초기값은 모두 0이 된다.

    반응형

    COMMENT