ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘/C언어] 수열의 합 알고리즘(4) / 합과 차 반복 (정보처리기사, 실기)
    Algorithm 2019. 5. 24. 20:48

    1. 1부터 100까지 합과 차 반복

    (Sum = 1 - 2 + 3 - 4 + ... + NUM(10) 항까지의 합)

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

     

    Sum = 1 - 2 + 3 - 4 + ... + NUM(10) 이 말은 

    Sum = 1 + (-2) + 3 + (-4) + ... + NUM(10)과 같다.

     

    그러니까 짝수를 음수로 만들어주면 되는데,

    이 때는 양수/음수를 바꿔 줄 스위치 변수를 이용하면 된다.

     

    위 코드에서는 sw 변수를 사용하였다. 

    변수 sw에 초기값 1을 할당하고 반복을 할 때마다 -1일 곱해주어

    양수/음수로 스위치시켜 주었다.

     

     

    실행결과

     


     

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

     

    위와 똑같은 코드인데, 단지 sw변수의 초기값을 -1로 설정한 코드이다.

     

     

    실행결과

     


     

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int i = 0, cnt, na, sum = 0;
    	for (cnt = 1; cnt <= NUM; cnt++) {
    		i = i + 1;
    		na = i - i / 2 * 2;  //na = i % 2; 알고리즘: na = i - int(i / 2) * 2
    		if (na == 1) {
    			sum = sum + i;
    		}
    		else {
    			sum = sum - i;
    		}
    		printf("cnt=%d, i=%d,  sum=%d\n", cnt, i,  sum);
    
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%d, i=%d,  sum=%d\n", cnt, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    이번에는 현재값이 홀수덧셈을, 짝수뺄셈을 하도록 짠 코드이다.

    나머지i % 2 연산을 통해서 연산할 수 있는데,

    만약 % 연산자를 사용할 수 없는 경우에는 i - i / 2 * 2로 계산하면 된다.

     

     

    실행결과

     


     

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

     

    이번에는 sw의 초기값을 0으로 주었다.

    그리고 어떤 연산을 할 때, sw의 값이 0이면 덧셈 연산을 하고 sw를 1로 바꿔주고,

    sw의 값이 1이면 뺄셈 연산을 한 후 sw를 0으로 바꿔주었다.

    일종의 toggle방식이다.

     

     

    실행결과

     


     

    2. 계차수열의 합과 차 반복

    (Sum = -2 + 3 - 5 + 8 - ... + NUM(10) 까지의 합)

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

     

    계차수열의 합 알고리즘에서 sw 값만 추가하면 되는 문제라 매우 간단하다.

     

    실행결과

     


     

    3. 계차수열의 합과 차 반복_(2)

    (Sum = 2 - 3 + 5 - 8 + ... + NUM(10) 까지의 합)

    #include <stdio.h>
    #define NUM 10
    int main() {
    	int  cnt, sum = 2, i = 2, j = 0, sw = -1, m;
    	for (cnt = 1; cnt < NUM; cnt++) {
    		// sw = -sw; - 여기 위치한다면 sw의 초기값은 1
    		j = j + 1;
    		i = i + j;
    		m = i * sw;
    		sum = sum + m;
    		printf("cnt=%2d, j=%2d, i=%3d, sw=%3d, m=%4d, sum=%5d\n", cnt, j, i, sw, m, sum);
    		sw = -sw;
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("cnt=%2d, j=%2d, i=%3d, sum=%5d\n", cnt, j, i, sum);
    
    	system("pause");
    	return 0;
    }

     

    위와 동일한 문제이나 + - 의 순서가 바뀌었다.

    sw = -sw; 연산을 어디서 하느냐에 따라 sw의 초기값이 달라지니 유의해야 한다.

     

     

    반응형

    COMMENT