알고리즘/문제 풀이

백준 14490 - 백대열(C++)

qqlzzb 2022. 9. 4. 22:29

문제

https://www.acmicpc.net/problem/14490

 

14490번: 백대열

n과 m이 :을 사이에 두고 주어진다. (1 ≤ n, m ≤ 100,000,000)

www.acmicpc.net

풀이

주어진 숫자 2개를 최대한 약분하여 출력하는 문제이다.

입력이 n:m의 형태로 주어지기 때문에 문자열로 입력받아서 : 를 기준으로 자른 후, 최대공약수를 구해야 한다.

sstream 헤더만 입력하면 문자열 파싱과 문자열을 int로 바꾸는 것까지 가능하다.

두 수를 최대한 약분하려면 두 수의 최대공약수로 나눠주면 된다.

최대공약수는 유클리드 호제법으로 구할 수 있다.

두 숫자가 나누어 떨어지거나, 0이 될 때까지 나머지 연산을 반복하다 보면 최대공약수를 구할 수 있다.

 

코드

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;


int eculidean(int a, int b)
{
    int n=a;
    while(n>0)
    {
        if(n%b==0) return b;
        else
        {
            int tmp=n%b;
            n=b;
            b=tmp;
        }
    }
    return 1;
}

int main()
{
    string str;
    cin>>str;
    istringstream ss(str);
    string stringbuffer;
    vector<string> v;
    while(getline(ss,stringbuffer,':'))
    {
        v.push_back(stringbuffer);
    }
    int a,b;
    stringstream ssInt1(v[0]);
    ssInt1>>a;
    stringstream ssInt2(v[1]);
    ssInt2>>b;
    int t = eculidean(a,b);
    cout<<a/t<<":"<<b/t;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

백준 10826 - 피보나치 수 4(C++)  (0) 2022.10.13
백준 9251 - LCS (C++)  (0) 2022.09.13
SWEA 7701 - 염라대왕의 이름 정렬(C++)  (0) 2022.09.02
백준 18870 - 좌표 압축(C++)  (0) 2022.08.27
백준 2002 - 추월(C++)  (0) 2022.08.15