본문 바로가기
작업/Programming

Perfect C 프로그래밍 연습 7장 4, 5번 해결

 

 

7장부터는 반복문을 포함하는 문제들이 많이 나올 것이기 때문에
어떤 순서대로 처리가 이루어지는지, 처리 후의 값은 어떻게 되는지
순차적으로 적어가면서 해결해 보면 이해가 쉬울 것입니다.


이번 반복문 해결은 제가 이해한 선에서 작성해 보았습니다.
4, 5, 6, 7, 11, 13번 문제를 해결해 보았는데 내용이 많을 것 같아 분할하였습니다.


코딩한 내용이 이해가 잘 안 되신다면 아래의 설명을 같이 읽어보시면 됩니다.

 

 


 

4번. 2, 3, 5, 7 배수를 제외한 수 10개씩 출력

 

2, 3, 5, 7의 배수가 아닌 수 출력

 

1~100까지의 수에서 배수를 제외한 것들을 출력하는 것이기 때문에
100까지 반복할 수 있도록 for문을 구성합니다.

 

일정한 횟수에 따른 반복은 for문을 사용하는 것이 적절합니다.
이 처음 for문 안에서 각종 연산들이 일어난다고 생각하시면 됩니다.


if문으로 조건으로, 제시된 2, 3, 5, 7의 배수인지를 확인하면 됩니다.
만약 저 수들 중 하나라도 나누어 떨어지면 그 수의 배수이기 때문에 걸러내야 합니다.

 

 

걸러낸다는 것은 출력에 쓰임이 없는 놈이라는 것이기에 다음으로 넘어갈 필요가 있습니다.
따라서 continue로 다음 수를 비교하도록 하였습니다.

(continue를 만나면 아래를 무시하고 for문으로 건너감)


만약 조건에서 걸러지지 않았다면 그 수는 출력되어야 하기 때문에 else에서 출력시킵니다.
또 다른 조건인 10개씩 출력은 1줄에 10개 뽑아내라는 것이며 10개의 수를 출력하면 한 줄 띄라는 것입니다.


count 변수는 출력된 수의 개수를 저장하며, 

10의 배수(10, 20)만큼 저장되면 한 줄 띄도록 조건문을 만듭니다.

 

 

 


5번. 소수 출력

 

소수 출력

 

 

범위는 4번과 같은 1~100입니다. 문제에는 소수에 대한 정의도 제시되어 있습니다.


① 약수가 1과 자신뿐인 수
② 2에서부터 자기 자신까지 수로 나누어 떨어지지 않는 수


간단하게 생각하면 x(12)가 소수인지 알기 위해 2~x-1(11)까지 나누어 보고
나누어지는 수가 있으면(2, 3 등) 소수가 아닌 것이 되는 것입니다. 


이렇게 코딩을 하면 쉽기는 하겠지만 저는 다르게 생각했습니다.
만약 100이 아닌 더 큰 수까지 진입을 하게 된다면 해당 알고리즘은 처리 분량이 너무나 커집니다.

 


1223을 예로 들어보겠습니다. 1223은 소수입니다.
하지만 그것을 모르기 때문에 소수인지 확인하기 위해 처리를 시작합니다.

 

 

그럼 2~1222까지 계속 나누어 보면서 결국 끝까지 나누어지는 수가 없으니 소수라고 인식합니다.



그래서 처리를 보다 간단하게 할 수 있는 것을 생각해 보았습니다.

위키백과의 정보에서는 제곱근(루트 √)을 활용한 방법을 알려주었습니다.
그것을 활용해 보면 1223의 경우에는 34(√1223)까지만 확인해보아도 소수 판별이 가능합니다.


처리 방식은 아래와 같습니다.

 

7의 경우를 예로 들어보겠습니다.

간단한 알고리즘을 이용하면 2~6까지 나누어보고 결국 소수로 결정합니다.

 

 

제곱근을 이용한다면 2(√7)까지만 나누어도 소수로 결정할 수 있습니다.

제곱근 수의 범위 안(1, 2)에서 1을 제외하고 나누어지는 수가 있는지 확인하는 것입니다.

 

 

이는 합성수(소수가 아닌 것)들은 2개 이상의 소수의 곱으로 정해지기 때문에 가능한 것입니다.

 

 

count는 1을 포함한 약수의 최소 개수입니다. 소수들은 1과 자기 자신만 가지기 때문에

소수의 count는 모두 1입니다. 따라서 count가 2만 되어도 소수가 아님을 확인할 수 있는 것입니다.

 

 

저는 소수와 합성수 모두 찾기 빠르고 간단하고 생각하여 이 방식을 이용했습니다.

제곱근 연산은 <math.h>sqrt()함수를 사용했습니다.

 

 

제곱근은 보통 소수점까지 나오는데 소수점까지는 필요가 없기 때문에 int형 변환하였습니다.

 

 

두 번째 for문은 제곱근까지의 수(8의 경우 2)만큼만 반복합니다.

안의 if는 제곱근 수 안에서 나누어지는지 확인하며, 나누어진다면 count에 1을 더합니다.

반복이 끝나면 탈출하여 다음 if로 들어가며 count 개수를 통해 소수와 합성수를 판별합니다.

 

 

소수인 것은 3자리 간격으로 출력하도록 했습니다.

결과물은 가로로 너무 길어서 한 줄 띄웠습니다.

 

 

-끝-