알고리즘/codewars

codewars: Some Egyptian fractions

꾸준함. 2018. 2. 14. 01:28

문제 링크입니다: https://www.codewars.com/kata/54f8693ea58bce689100065f/train/cpp

이집트 분수는 일반 분수를 분자가 1인 분수들의 합으로 표현합니다.

예를 들어 4/5=1/2+1/4+1/20으로 표현됩니다.

상당히 흥미로운 주제인데도 불구하고 처음 접했기 때문에 개념이 상당히 어렵게 느껴졌는데 다행히 이에 대해 잘 설명된 포스팅이 있었기 때문에 프로그램을 쉽게 작성할 수 있었습니다.

https://en.wikipedia.org/wiki/Egyptian_fraction <- 영어로 작성되어있지만 이집트 분수에 대해 상세히 설명되어있습니다.

한글로 작성된 글은 아래 링크가 자세히 설명되어있는 것 같습니다! 

http://blog.naver.com/PostView.nhnblogId=forfriend5&logNo=220548077589&parentCategoryNo=12&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView


#include <iostream>

#include <string>

using namespace std;

 

class Decomp

{

public:

        static string decompose(const string &nrStr, const string &drStr);

};

 

//numerator String, denominator String

string Decomp::decompose(const string &nrStr, const string &drStr)

{

        string result = "[";

        long long numerator = atoll(nrStr.c_str());

        long long denominator = atoll(drStr.c_str());

        while (!(numerator==0 || denominator==0))

        {

               if (denominator % numerator == 0) //분자가 분모로 나누어진다면 ex) 12/24

               {

                       result += "1/";

                       result += to_string(denominator / numerator);

                       return result += "]";

               }

               if (numerator % denominator == 0) //분수가 아니라 양의 정수라면

               {

                       result += to_string(numerator / denominator);

                       return result += "]";

               }

               if (numerator > denominator) //분자가 분모보다 큰 경우(대분수로 만듬)

               {

                       result += to_string(numerator / denominator);

                       numerator %= denominator;

                       result += ", ";

                       continue;

               }

               //(분자/분모) upper_bound

               long long newDenominator = (denominator / numerator) + 1;

               result += "1/";

               result += to_string(newDenominator);

               result += ", ";

               //이집트 분수 공식대로 진행

               numerator = (numerator*newDenominator) - denominator;

               denominator *= newDenominator;

        }

        if(result.length()>2) //0 0이 입력된 경우 고려

               for(int i=0; i<2; i++)

                       result.pop_back(); //마지막 쉽표와 공백 삭제

        result += "]";

        return result;

}

 

int main(void)

{

        cout << Decomp::decompose("3", "4") << endl;

        cout << Decomp::decompose("12", "4") << endl;

        cout << Decomp::decompose("4", "5") << endl;

        cout << Decomp::decompose("66", "100") << endl;

        return 0;

}



개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > codewars' 카테고리의 다른 글

codewars: Sum by Factors  (0) 2018.02.20
codewars: Path Finder #2: shortest path  (0) 2018.02.20
codewars: Valid Braces  (0) 2018.02.14
codewars: Base -2  (0) 2018.02.07
codewars: RGB To Hex Conversion  (0) 2018.02.07