문제
컴퓨터과학과 학생들 n명이 소풍을 가서 원 모양으로 둘러 앉아 게임을 하려고 한다. 학생 번호는 0부터 n-1번까지이다. 0번 학생부터 숫자 1부터 차례대로 부르면서 소수가 걸린 학생은 박수를 치는 방법이다. 학생의 수와 마지막에 부른 수가 주어졌을 때 특정 번호의 학생이 박수를 몇 번 쳤는지 알아보는 프로그램을 작성하여라.
다음과 같이 한 줄로 입력하되 각 항목은 공백으로 구분한다.
5명의 학생들이 소수놀이를 하는 경우 마지막으로 불린 수가 17이라면 3번 학생은 몇 번 박수를 쳤을까를 알고 싶을 때, 입력 예) 5 17 3
<입력 조건>
-학생 수 n은 최소 2명 최대 1,000명
-부를 수 있는 수 su의 범위는 1이상 n*n이하
-학생의 번호 no는 0이상 n 미만
<입력 및 출력의 예>
5 17 1
1번 학생은 3번 박수를 쳤다
요구분석
학생 수 n에 2~1000사이의 값을 입력받는다
학생 번호는 0부터 n-1번 까지이다.
0번 학생부터 숫자1부터 차례대로 부르다 소수가 걸린 학생은 박수를 친다.
부를 수 있는 수 su는 1이상 n*n 이하이다.
해결방법
1.배열을 이용하여 박수친 횟수를 각각의 방에 저장하여 출력하는 방법.
2.구조체를 이용하여 박수친 횟수를 각각의 방의 count에 저장하여 출력하는 방법.
2번선택, 구조체를사용하면 박수친 횟수외에 학생 정보를 추가로 입력할 수도 있기 때문에
배경지식
소수를 구하는 방법
소수 : 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수
ex) 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31과 같은 수를 소수라고 한다.
알고리즘
1. 사용자로부터 학생수, 불린수, 알고싶은 학생번호를 입력받는다.
2. 반복문을통해 조건이 만족할 때까지 값을 입력받는다.
3. 선언한 구조체의 count값을 초기화시킨다.
4. 반복문을 통해 주어진 학생수만큼 돌고나면 다시 처음부터 돌도록 지정을 해주고 각 해당하는 차례가 소수인지 아닌지 판별한뒤 count에 값을 입력해준다.
5. 결과를 출력한다.
소스코드
#include <stdio.h>
int pnum(int n);
void main(){
int n,su,no,i,j=0;
struct cs{
int count;
}a[1000];
printf("학생수, 불린수, 알고싶은 학생번호 입력 : ");
scanf("%d %d %d",&n,&su,&no);
while(1){
if(n<2 || n>1000 || no>=n || no<=0 || su<1 || su>n*n){
printf("잘못된 입력값입니다.\n");
printf("2<=n<=1000 , 1<=su<=n*n , 0<no<=n 의 값을 입력하시오 : ");
scanf("%d %d %d",&n,&su,&no);
}
else
break;
}
for(i=0;i<n;i++) // count값 초기화
a[i].count=0;
for(i=1;i<=su;i++){ //입력받은 수만큼 돌면 다시 0부터 시작
if(j==(n-1)){
if(pnum(i)){
a[j].count++;
}
j=0;
}
else{
if(pnum(i)){
a[j].count++;
}
j++;
}
}
printf("%d번 학생이 %d번 박수쳤다.\n",no,a[no].count);
}
int pnum(int n){
int i;
if(n==1)
return 0;//1은 소수가 아님
for(i=2;i<n;i++){
if(n%i==0)
return 0; //1외에 약수가 있음
}
return 1;//소수
}
실행결과
예외 Test
향후과제
좀 더 간단하고 효율적인 방법으로 숫자놀이를 구할 수 있는지 알아볼것
고찰
이전의 과제에 비해 다소 편하게 코딩을 할 수 있어서 상당히 즐거웠고, 배열과 구조체를 사용해 깔끔하게 소스 코드를 작성할 수 있어 뿌듯했다.
'개발자 > C' 카테고리의 다른 글
C언어 대시 수 세기 (0) | 2015.09.29 |
---|---|
C언어 초침과 분침이 직각을 이룰때 시각 구하기 (0) | 2015.09.29 |
C언어 나무심기 (1) | 2015.09.29 |
C언어 공약수, 최대공약수 출력 (0) | 2015.09.29 |
C언어 제곱수 출력 (0) | 2015.09.29 |