728x90
문제설명

두 정수 a, b를 입력받아서, a, b의 최대공약수를 출력하시오.

 

 

입력

정수 a, b가 공백으로 구분되어 입력된다.(1<=a,b<=10,000)

 

 

출력

a, b의 최대공약수를 출력한다.

 

 

입력예시

64 128

 

 

출력예시

64

 


#include <stdio.h>
int main(void){
    int a,b;
    int min=0;
    scanf("%d %d", &a, &b);
    for(int i=1;i<=a;i++){
        if(a%i==0&&b%i==0){
            min=i;
        }
        
    }
    printf("%d", min);
    return 0;
}

이 문제를 굉장히 꼬아서 생각했다. 어디에선지는 기억안나지만 16진수 문제였기 때문으로 기억한다. 그래서 그 형태로 구하는 것을 생각했던 것 같다. 그런데 그것이 아니였다. 최대공약수이기 때문에 둘다 나눠지는 것중 가장 큰 값만 구해주면 되는 것이다. 그렇기에 for문을 이용할 수 있다. i값을 대입해 나누어 지는지 계속 확인하고 나눠지는 값이 나올때마다 min값으로 교체해주면 되는 것이다. 나누어져야 한다는 두 조건을 만족하기 위해 &&를 이용한다. 그리고 계속 반복해서 끝나게 되면 printf를 이용해 min값을 출력해주면 된다.

기존 문제의 틀에 갇히지 말고 본래의 의미를 생각해보자!

728x90
728x90
문제설명

시작수(aa)와 마지막 수(bb)가 입력되면

aa부터 bb까지의 모든 홀수를 출력하시오.

이 문제는 반복문 for, while 등을 이용하여 풀수 없습니다.

금지 키워드 : for while goto

 

 

입력

두 수 a, b 가 입력된다. (1<=a<=b<=1001<=a<=b<=100)

 

 

출력

a~b의 홀수를 모두 출력한다.

 

 

 

입력예시

2 7

 

 

출력예시

3 5 7


#include <stdio.h>
int n1=1;
void num(int n1, int n2){
    if(n1>n2){
        return;
    }
    if(n1%2!=0){
        printf("%d ",n1);
    }
    num(n1+1,n2);
}
int main(void){
    int number1, number2;
    scanf("%d %d", &number1, &number2);
    num(number1, number2);
    return 0;
}

이 문제는 앞에와 크게 다르지 않다. 달라진점을 말한다면 넘기는 변수가 하나 더 생겼다는 것이다. 그래서 저장하는 과정과 넘기는 과정, 그리고 받는 변수 자리에서는 2개씩 선언해준다. 그리고 for, while을 못쓴다고 하여 그냥 if문으로 판단해주기로 했다. n1이 n2보다 커지는 순간으로 설정을 해주면 n1이 하나씩 더해주는 과정에서 종료될 수 있을 것이라고 생각하였다. 그리고 한번더 if문을 선언해서 안에 부분은 2로 나누어 나머지가 나올 경우만 출력해주도록 해야 한다.

 

여기 마지막 num() 재귀함수 과정에서 살짝 머뭇거렸는데 그 이유는 앞 문제와 마찬가지로 한가지 값만 전달했기 때문이다. 이러면 오류가 나게 된다. 그러므로 n1 처럼 하나만 바뀌면 그것은 병화를 주고 다른 하나는 n2라고 그대로 값을 설정해주면 큰 문제가 생기지 않는다.

728x90
728x90
문제설명

정수 nn부터 11까지 출력하는 재귀함수를 설계하시오.

이 문제는 반복문 for, while 등을 이용하여 풀수 없습니다.

금지 키워드 : for while goto

 

 

입력

정수 n이 입력된다(1<=n<=200)

 

 

출력

n부터 1까지 한 줄에 하나씩 출력한다.

 

입력예시

10

출력예시

10

9

8

7

6

5

4

3

2

1

 


#include <stdio.h>
int n1=1;
void num(int n){
    if(n==0){
        return;
    }
    printf("%d\n", n);
    num(n-1);
}
int main(void){
    int number;
    scanf("%d", &number);
    num(number);
    return 0;
}

이문제는 순차 출력보다 훨씬 쉬웠던 문제였다. 기존 문제에서 이제 n1을 넣지 않고 n으로 설정해서 출력해주었다. -1를 해주면 되기 때문이다. 그렇게 해서 출력하면 크게 어렵지 않았던 문제였다. 마지막에 n이 0이 되었을 때 return 해주면 된다.

728x90

+ Recent posts