PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/09/09 01:16:05
Name EZrock
Subject 오일러의 수 e를 구하는 프로그램에 대한 질문...
솔직히 과제하면서 생각은 할만큼 하는데 도무지 진전이 없을 경우엔 가장 먼저 떠오르는 곳이 PGR입니다.

친구들에게 묻자니 이 시간에 좀...;;;

C++로 오일러의 수 e를 구하는데 조건이 있습니다.

e = 1+1/1!+1/2!+1/3!+....+1/n! 단 1/n! <0.0000001 까지만 계산

재귀함수도 사용하라고 하시더군요.

그런데 재귀함수를 사용할려니까 1~정해진 n까지 구하는건 알겠지만

1/n! <0.0000001을 만족하는 n을 구할려니까 또 머리가 아프더군요;;

이번에도 pgr에 오기 전까지 두어시간 고민하다가 올립니다-_-);;;

#include <iostream>

using namespace std;

class Euler{
        double nFact;
        double eNumber;
public:
        Euler();
        ~Euler(){}

        void SetnFact(double _nFact) {nFact = _nFact;}
        double GetnFact() {return nFact;}

        void SeteNumber(double _eNumber) {eNumber = _eNumber;}
        double GeteNumber() {return eNumber;}

        int nFactorial(int n);
};

Euler::Euler()
{
        nFact = 0;
        eNumber = 1;
}

int Euler::nFactorial(int n)
{
        if (n==1) return 1;
        else return n * nFactorial(n-1);
}

int main()
{
        int n = 1;

        double _nFact = 0;

        double _eNumber = 1;

        Euler e;
        
        do {
                _nFact = e.nFactorial(n);
                e.SetnFact(_nFact);
                n++;
        } while(1 > 0.0000001*e.GetnFact());

        for(int i=1; i<=n; i++){
                _eNumber = e.GeteNumber() + 1/e.nFactorial(n);
                e.SeteNumber(_eNumber);
        }

        cout << "오일러의 수 e : " << e.GeteNumber() <<endl
                << "1/n! < 0.0000001 을 만족하는 n : " << n << endl;

        return 0;
}

일단 어떻게 어떻게 짠게 이렇습니다만...

문제점이 많은데 개선을 할려니 너무나도 복잡해 지더군요-_-);;;

클래스 멤버 변수로도 원래는

1/n!<0.0000001을 만족하는 정수 n과 1/n!값인 nFact와 오일러의수 e를 저장할 eNumber 3개를 썼는데

정작 n을 get set함수로 불러낼려니 식이 너무 복잡해 졌습니다. 증가 시킬려면 패러미터 패싱용 매개변수를 또 만들어야 되고...

그냥 차라리 n을 메인함수 내에서 쓰고 말지 할 정도로 복잡해 져서 그냥 n자체는 메인함수에서 쓰도록 만들었습니다.

그리고 일단은 클래스 모양을 유지할려고 패러미터 패싱용 변수 _nFact와 _nNumber를 쓰긴 했지만 역시 그냥 메인에서 쓰는걸 억지로 클래스화 시킨다는 모습을 지울수 없더군요.

클래스 디자인 자체가 부족해서 벌어지는 일인데 처리 자체가 개념이 부족한 저로써는 방법이 없더군요.

이걸 굳이 메인에서 처리해야 하나...함수로 따로 빼야겠는데 이걸 어떻게 클래스 안에 넣는가...이런저런 고민하다 보니 될 일도 안되더군요...그래서 pgr을 찾아 왔습니다. 그냥 모르는거 있으면 될때까지 해보고 안되면 뻔뻔하게 올리기로 작정한 저를 욕하진 말아주세요...

실력이 부족해서 오늘도 안풀리는 스트레스로 위경련 한바탕 하고 왔답니다...ㅠ_-

그리고 두번째로는 1/n!을 구하는 알고리즘 자체의 문제입니다.

보통 재귀함수가 주어진 범위를 알면 참 편하고 쉬운데...이건 범위가 없고 조건만 달랑 있으니 어떻게 끼워 맞춰야 할지를 모르겠습니다;;

그냥 1부터 조건에 맞는 n까지 증가시키면서 가는데 암만봐도 재귀라고 쓰긴 썼는데 재귀와는 거리가 먼 느낌입니다.

원래는 n이 딱 주어져 있으면 else return n*func(n-1); 이렇게 끝까지 쭈욱 가서 다시 올라오는 형태기 때문에 이래저래 알고리즘 짜는데 골치가 아프긴 합니다...

오늘도 머리 썩히면서 잡고 있습니다.

저도 다시 열심히 생각할테니 좋은 알고리즘이나 클래스 디자인에 대한 의견 있으시면 꼭 부탁드리겠습니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/09/09 01:58
수정 아이콘
double Euler( int n, double e )

double eDelta = 1 / nFactorial( n );
double eRet = e + eDelta;
if ( eDelta < 0.0000001 ) return eRet;
else Euler( n + 1, eRet );


main(...)

...
double e = Euler( 1, 0 );
...


일감으로는 이렇게 하면 될 듯 한데요, 직접 돌려본게 아니라서.. 확실하진 않습니다. (죄송합니다 꾸벅~ ( __) )
08/09/09 02:15
수정 아이콘
일단 오일러 급수가 뭔지가 기억이 나지 않아 알고리즘과 Class를 설계하는 것에는 도움을 드리기 어렵지만...

!를 재귀함수로 만드는 것이 핵심 포인트 같다는 생각이 드네요...

그런데... ! 이.... 더하기 였던가... 곱하기 였던가..... 바보가 되어 가나요.... 암튼....

!을 리커시브로 만들면 나머지는 쉽게 풀릴것 같다는 막연한 생각이 드네요.... 프로그램 문제이고 수학문제가 아니기 때문에...
08/09/09 02:20
수정 아이콘
lovehis님// 글쓴님이 올리신 코드를 보면, ! 함수는 이미 리커시브로 구현이 돼있네요.;;;
08/09/09 02:24
수정 아이콘
아... 코드를 보니... AhnGoon님 코드가 돌아 갈것 같이 보이네요.
08/09/09 02:26
수정 아이콘
AhnGoon님// 저도 그걸 보고... 내가 무슨 말을 했던가 했습니다.... 사실 코드도 보지 않고 대답을 했었죠.... 말한 후 오일러 급수가 뭐였는지 코드를 보며 생각을 해냈습니다. ^^;;;
08/09/09 02:30
수정 아이콘
lovehis님// 아하하.. 뭐, 남의 코드라는게 꼼꼼히 살피지 않으면 뭐가 있는지 파악하기가 쉽지 않은게 당연하죠 ^^;
그리고, 제가 올린 코드도... EZrock님이 막상 써먹을라면 애좀 먹을거에요. 보아하니 학부생이신거 같은데.
원래 C++ 코드가 익숙해지기 전까지는 무지막지하게 빡세죠. 크크크.. ^^;;
08/09/09 07:27
수정 아이콘
e_k = 1+1/1!+1/2!+1/3!+....+1/k!
e_(k+1) = 1+1/1!+1/2!+1/3!+....+1/k! + 1/(k+1)!
라고 하면
e_k*(k+1)! +1 = e_(k+1)*(k+1)! 인걸 이용해서 프로그램을 좀 바꿔봤습니다. ^^

#include <iostream>

const double min_fraction = 0.0000001;
const unsigned rev_min_fraction = (unsigned)(1/min_fraction);

void get_euler_fraction(unsigned &numerator, unsigned &denominator, unsigned n)

if ( denominator*n < rev_min_fraction )
{
numerator = numerator*n + 1;
denominator *= n;

get_euler_fraction( numerator, denominator, n+1 );

}

double get_euler()

unsigned numerator = 1;
unsigned denominator = 1;

get_euler_fraction(numerator, denominator, 1);

return ((double)numerator)/denominator;


int main()

std::cout << "result is: " << get_euler() << std::endl;
return 0;


개인적인 의견으로는 EZrock은 아직 알고리즘에 고민하기 보다는 우선 C++에 익숙해지시는걸 생각하는게 나을거 같습니다. ^^
웬지 C++이라서 class를 코드에서 사용하려고 좀 무리해서 집어넣고 계신것 같은데, 굳이 필요하지 않은 곳에 class를 쓴다고 해서 C++ 코드가 되는건 아닙니다. 오일러 함수를 구하는데 굳이 class를 사용할 필요는 없죠.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
41904 급전이 필요해서 그런데요~ [12] 껀후이2070 08/09/09 2070
41903 orcad 질문입니다 (pspice) 키라야마토2467 08/09/09 2467
41902 빛의 굴절에 대한 질문 [5] 타우τ1955 08/09/09 1955
41901 신자유주의의 입장을 일목요연하게 정리한 글 [3] 김솔직1916 08/09/09 1916
41900 이번 올스타전 이제동과 이영호선수의 경기 어디서 볼 수 있나요..? [2] 완성형폭풍저1826 08/09/09 1826
41899 자동차관련 영어질문이요.. [2] funnyday1866 08/09/09 1866
41898 ICCup에 /transfer 라는 기능이 있나요? [4] 공유2130 08/09/09 2130
41897 멜로디가 좋은 가요 추천해 주세요 [2] 허접플토2149 08/09/09 2149
41896 [영어]간단한 질문입니다. [10] HitheRoad1837 08/09/09 1837
41895 컴퓨터 고수님들 계신가요?? [7] 무조건한놈만1929 08/09/09 1929
41894 프린터 추천 부탁드립니다. ^^; [4] 기용패트리2100 08/09/09 2100
41893 에라이 모르겠다식의 마인드를.. [8] 아레스2083 08/09/09 2083
41890 노트북 구입하려고 하는데, 추천 좀 부탁드리겠습니다. [10] LegNa.schwaRz1656 08/09/09 1656
41889 영화 '고양이를 부탁해' 대사에 관한 질문입니다. [2] 박진호2498 08/09/09 2498
41888 iptv에 관해 질문이 있습니다. [5] 행복하게살자2124 08/09/09 2124
41887 오래된 그래픽 카드에 대한 질문입니다.. [7] OrBef1759 08/09/09 1759
41886 새 폰 추천과 DMB에 관한 질문입니다. [6] MayBe1731 08/09/09 1731
41885 C언어 extern 관련 문제 <고수님들 부탁드려요.> [4] Haru2302 08/09/09 2302
41883 오일러의 수 e를 구하는 프로그램에 대한 질문... [7] EZrock3306 08/09/09 3306
41882 위에좋은음식좀 알려주세요! [4] Jess:D1835 08/09/09 1835
41881 [야구] 안타 vs 범타 [13] kikira2189 08/09/09 2189
41880 야구관련 질문 드립니다. [9] Third1529 08/09/09 1529
41879 가을에는 코디를 어떻게 하면 좋을까요?? [2] 나를찾아서2117 08/09/09 2117
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로