Layer 7 03 과제
# 문제
1) 팩토리얼(!) 프로그램 구현
- n이 입력되면 n!의 값을 출력하시오.
2) 두 자연수 a, b 사이의 구간에 대해서
홀수는 더하고 짝수는 빼는 식을 보여준 후 결과를 출력하시오.
ex)
- a = 5, b=10 일 경우, 5-6+7-8+9-10=-3
- a = 6, b=9 일 경우, -6+7-8+9=+2
3) 별찍기 문제 풀어오기 (아래에 사진)
# 문제 풀이
1. 팩토리얼(factorial)
- 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n!로 나타낸다.
또한 0!=1로 약속한다.
- ex) n=5일 경우 n!= 1*2*3*4*5 = 120
1-1. 프로그램 코드
1-2. 동작 설명
- 먼저, 입력 받는 값을 저장할 변수 n을 선언하고, 그 후 정수를 입력 받는다.
그 후 1~n까지 모든 수를 곱한 수를 저장할 변수 sum을 만든 후
for문을 이용해 i(1)부터 n이 될 때까지 i의 값을 1씩 증가 시키며
i의 값을 변수 sum과 곱한 후 다시 저장한다.
그 후 printf() 함수로 팩토리얼(factorial) 값을 출력한다.
1-3. 실행 결과 ex)
1-4. 프로그램의 취약점
-팩토리얼의 값이 int형이 표현 할 수 있는 범위를 넘어가면 오버플로우(overflow)가 일어남.
-> 좀 더 표현 범위가 큰 long long int를 사용하면 되지만 long long int의 범위를 넘어가는
쓰면 또 오버플로우(overflow)가 일어남.
2. 두 자연수 a, b 사이의 구간에 대해서
홀수는 더하고 짝수는 빼는 식을 보여준 후 결과를 출력하시오.
2-1 프로그램 코드
2-2 동작 설명
- 입력 받을 변수 a, b를 만들고, 결과를 저장할 result 변수를 만듦.
그 후 scanf() 함수로 입력을 받고, 만약 a가 b보다 크다면
(먼저 입력 받은 값이 후에 입력 받은 값 보다 크다면) 둘의 값을 교환(swap)한다.
for문을 이용해 변수 a가 b 보다 작거나 같을 때까지 변수 a를 1씩 증가시키며 반복을 한다.
for문 안에 result+=a%2?a:-a;라는 부분은 삼항 연산자를 사용한 부분이며.
a라는 변수를 2로 나누었을 때 1이라면 a를 result+=a하고, 만약 아니라면
result+=-a를 한다. 그 후 값을 출력한다.
2-3 실행 결과 ex)
3~5. 여러가지 모양의 별 찍기.
3-1 프로그램 코드
3-2 동작 설명
- 첫 번째 for문을 이용해 5번 반복.
두 번째 for문은 i의 숫자 만큼 반복하여 별을 찍는다.
예를 들어 i=1이라고 했을 때 1번 반복을 하여 별 1개를 찍고, for문을 탈출한다.
그 후 printf("\n") 부분을 만나 줄바꿈을 한다.
- 요약: 첫 번째 for문=세로줄, 두 번째 for문 = 가로줄
3-3 실행 결과 ex)
4-1 프로그램 코드
4-2 동작 설명
- 위 3번의 별 찍기를 거꾸로 한 형태.
첫 번째 for문은 3과 동일하게 5번을 반복한다.
하지만 차이점은 5~1까지 -1씩 감소시키며 반복한다.
두 번째 반복문은 똑같이 i 만큼 반복하여 별을 찍는다.
i=5일 때 j도 5번 반복하기 때문에
처음에 별 5개, 4개, 3개, ... 이런식으로 감소하며
별이 찍히게 된다.
4-3 프로그램 실행 결과
5-1 프로그램 코드
5-2 동작 설명
- 먼저 4~0까지 -1만큼 감소 시키며 총 5번을 반복한다 .
두 번째 for문에서는 1~i까지 반복을 하며 공백(space)를 출력 한다.
그 후 for문 하나를 더 써서 5-i로 별의 개수를 찍는다.
-공백을 먼저 모두 출력하고, 그 후에 별을 찍는다는 생각으로
프로그램을 만들었다.
4-3 프로그램 실행 결과
조금 보다가 어려운 부분이 있으시거나
잘못된 부분이 있다면 댓글로 꼭 알려주세요!.
봐주셔서 감사합니다.!