문제
https://www.acmicpc.net/problem/14490
풀이
주어진 숫자 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 |