-
[알고리즘/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의 초기값이 달라지니 유의해야 한다.
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/C언어] 도형 알고리즘 / 사각형 ㄹ자 채우기 (정보처리기사, 실기) (0) 2019.05.24 [알고리즘/C언어] 수열의 합 알고리즘(5) / Sum = (1 * 10) + (2 * 9) + (3 * 8) + ... + (10 * 1) (정보처리기사, 실기) (0) 2019.05.24 [알고리즘/C언어] 구구단 출력을 goto문으로 해보자 (정보처리기사, 실기) (0) 2019.05.23 [알고리즘/C언어] 수열의 합 알고리즘(3) / 계차수열의 합 (정보처리기사, 실기) (0) 2019.05.20 [알고리즘/C언어] 수열의 합 알고리즘(2) / for문, while문, do-while문, goto문 (정보처리기사, 실기) (0) 2019.05.19 COMMENT