문제
요구분석
1) 숫자 5개를 공백으로 구분해 입력받는다.
2) 입력받은 숫자는 한자리수의 정수여야한다.
3) 입력 조건에 맞지 않으면 “INPUT ERROR”를 출력한다.
4) 첫 번째 숫자가 –999이면 프로그램을 종료한다.
5) 5개중 3개의 숫자를 단 한번만 적용해 세 자리 자연수를 만들 때 짝수가 만들어질 확률을 계산한다.
6) 세자리 자연수와 짝수를 각각 크기순으로 출력하고 세자리 자연수일 경우, 짝수일 경우를 5개씩 한줄에 출력하고, 세자리수가 짝수일 확률을 기약분수로 출력한다.
해결방법
입력받은 숫자를 다중 반복문을 이용하여 3자리수를 구하고, 구한값이 짝수일경우를 출력하고 각각의 경우를 최대공약수를 이용해 확률을 출력한다.
배경지식
-순열 : 서로 다른 n개 중에서 r개(n≥r)를 취하여 그들을 일렬로 세울 때, 늘어세운 것 하나 하나를 n개 중에서 r개를 가지는 것
-최대공약수 : 2개 이상의 수의 공약수 중에서 최대인 수이다.
알고리즘
1. 사용자로부터 정수값 5개를 입력받는다.
2. 입력받은 값이 조건(정수는 0~9,중복값 없음,첫자리 –999일 때 종료 등)에 맞는지 확인 한다.
3. 입력받은 값이 정상일 경우 오름차순으로 정렬한다.
4. 다중for문을 이용하여 3자리의 자연수를 만들어 배열에 저장하고 출력한다.
5. 3자리의 자연수 중 짝수인 경우 새로운 배열에 저장하고, 출력한다.
6. 세 자리의 개수, 짝수의 개수에 count했던 값을 대입한다.
7. 확률은 두 count수의 최대공약수를 구해 나누어 기약분수로서 나타낸다.
소스코드
#include <stdio.h>
#include <stdlib.h>
int gcd(int x,int y);
int main(){
int input[5],output[60]={0},tmp[48]={0},tp=0;
int i,j,k,flag=0,same=0;
int count=0,allcount=0,nallcount=0;
for(i=0;i<5;i++){
scanf("%d",&input[i]);
if(input[0] == -999)
exit(0);
if(input[i]<0 || input[i]>=10){
printf("INPUT ERROR\n");
}
}
for (int i = 0; i < 5; i++)
{
for(int j=i+1;j<5;j++)
{
if(input[i]==input[j])
{
same=1;
}
}
}
if(same==1){
printf("INPUT ERROR\n");
exit(0);
}
for (int i = 0; i < 5; i++){ //오름차순 정렬
flag = 0;
for (int j = 0; j < 5-i-1; j++){
if (input[j]>input[j + 1]){
tp = input[j];
input[j] = input[j + 1];
input[j + 1] = tp;
flag = 1;
}
}
if (flag == 0)
break;
}
printf("가능한 세 자리 수\n");
for(i=0;i<5;i++){
if(input[i]==0) continue;
for(j=0;j<5;j++){
if(j==i) continue;
for(k=0;k<5;k++){
if(k==j || k==i) continue;
output[count] = input[i]*100 + input[j]*10 + input[k];
allcount++;
count++;
}
}
}
for(i=0,count=0;i<allcount;i++){
printf("%d",output[i]);
count++;
if(output[i]=='NULL')
break;
else if(count%5==0)
printf("\n");
else{
printf(", ");
}
}
for(i=0,j=0;i<allcount;i++){
if(output[i] != 0 && output[i]%2==0) {
tmp[j++] = output[i];
nallcount++;
}
}
printf("\n\n");
printf("가능한 짝수\n");
for(i=0,count=0;i<nallcount;i++){
printf("%d",tmp[i]);
count++;
if(tmp[i]=='\0')
break;
else if(count%5==0)
printf("\n");
else{
printf(", ");
}
}
printf("\n\n");
printf("세 자리의 개수 : %d\n",allcount);
printf("짝수의 개수 : %d\n",nallcount);
printf("확률 : %d / %d\n",nallcount/gcd(allcount,nallcount),allcount/gcd(allcount,nallcount));
}
int gcd(int x,int y){
int i,max=1;
for(i=1;i<=x;i++){
if((x%i==0) && (y%i==0))
max = i;
}
return max;
}
실행결과
고찰
이때까지 배운 지식을 총 동원해서 푼 문제인 것 같았습니다.
오름차순 정렬, 최대공약수도 이용하고, 각종 조건문도 풀어보고 약간 난이도 있었던 문제였던 것 같습니다.
'개발자 > C' 카테고리의 다른 글
visual studio scanf 에러, scanf_s 사용 (0) | 2015.10.08 |
---|---|
C언어 진법변환 (0) | 2015.09.29 |
C언어 대시 수 세기 (0) | 2015.09.29 |
C언어 초침과 분침이 직각을 이룰때 시각 구하기 (0) | 2015.09.29 |
C언어 소수놀이, 소수구하기 (0) | 2015.09.29 |