ABOUT ME

비바리퍼블리카(토스)에서 Frontend Developer로 일하고 있습니다.

  • [알고리즘/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