긴 자리 정수(BigInt) 게산이 가능한 ObjectiveC 언어로 작성된 소스를 작성하고 컴파일한다.

컴파일은 Mac OS X 10.6.x 의 명령줄(커맨드 라인)에서 gcc 로 한다.

   우선  http://www.santsys.com/code/display?folder=Objective-C&file=BigInt.h 에서 헤더 파일 BigInt.h 및구현 파일 BigInt.m 을 구해야 한다.
 
    그리고 BigInt.h 의 째 줄
#define MAX_LENGTH 70
을 
#define MAX_LENGTH 640
로 수정한다.


  아래의 소스는 300^2048 (300의 2048승)  까지 계산이 가능함을 보여준다. 

main.m 파일의 내용
/*
 * Filename: main.m
 *
 *  Compile: gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=c99
 *        Or gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=gnu99
 *
 *    Date: 2011. 8. 4.
 *  Author: phk
 */

#import <Foundation/Foundation.h>
#import <Foundation/NSString.h>
#import <stdio.h>
#import "BigInt.h"

int main( int argc, const char *argv[] ) {
    // create a new instance
    BigInt *x = [[BigInt alloc] initWithInt: 100];
    BigInt *y = [[BigInt alloc] initWithInt: 200];
    BigInt *z = [[BigInt alloc] init];
 
    [x initWithInt: 100];
    [y initWithInt: 200];
    x = [x add: y];
    z = [z add: x];
    z = [z multiply: z];  // z = 300^2
    z = [z multiply: z];  // z = 300^4
    z = [z multiply: z];  // z = 300^8
    z = [z multiply: z];  // z = 300^16
    z = [z multiply: z];  // z = 300^32
    z = [z multiply: z];  // z = 300^64
    z = [z multiply: z];  // z = 300^128
    z = [z multiply: z];  // z = 300^256
    z = [z multiply: z];  // z = 300^512
    z = [z multiply: z];  // z = 300^1024
    z = [z multiply: z];  // z = 300^2048
    // z = [z multiply: z];  // z = 300^4096

    // print it
    NSLog( @"x = %@\n", [x toStringWithRadix: 10] );
    NSLog( @"z = %@\n", [z toStringWithRadix: 10] );
    NSLog( @"The digits of z are %d\n", [[z toStringWithRadix: 10] length] );

    // free memory
    [z release];
    [y release];
    [x release];

    return 0;
}


컴파일하기

컴파일은 세개의 파일 BigInt.h, BigInt.m,  main.m  을 모두 동일한 폴더에 저장하고, 그 폴더에서 다음의 gcc 컴파일 명령을 내린다.
 

$ gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=c99
또는
$ gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=gnu99

위에서 옵션 -std=c99 (또는 -std=gnu99)를 사용한 이유는 구현 파일 BigInt.m 에

    for (int i = 0; ... ; ... ) {
     ..........
    }

처럼 int i 의 선언이 구문 중간 중간에 있기 때문이다.

    int i;
    for (i = 0; ... ; ... ) {
     ..........
    }

처럼 int i 선언을 밖으로 뽑아내도 되지만 그러자면 구현 파일 BigInt.m 을 여러 곳 수정해야 하기 때문에 번거롭다.  이런 때는 컴파일 옵션 -std=c99(또는 -std-gnu99) 을 사용하는 것이 편리하다.

만일 이 옵션을 생략하여 명령

$ gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main
으로 컴파일하면 에러 메세지

BigInt.m: In function ‘-[BigInt initWithBigInt:]’:
BigInt.m:129: error: ‘for’ loop initial declaration used outside C99 mode
...........................
......................... 

 
를 만난다. 

 


실행하기
$ ./main
2011-08-04 20:42:51.809 main[5267:903] x = 300
2011-08-04 20:42:52.077 main[5267:903] z = 13942147270623679146873528796701570723260623211399818675976228428320324826739932742348
50024760182945480272076581245800069562691222247613756153589976812373494337854015847291
06693395255281491169142017082115307947771801954704567433211464560639140944673635364155
01669338920161359403898468691617862370257835219063625177603974210138485147431108373510
28779931312121969626954646544698167192029706192523430266460141324855483079358472609004
41555694943498191955672798596377459777392636575523873495086339994375985976543710570091
43823325722842052959455745735960972363978751956762143499995484338210048940092499596190
40232593243010479659177831242751628805145427355281522289274838413728448102554703994718
41348890379437250393401562476664019972812975660227449988177768002661436897984534184331
07995039930675681806131094808453498537466120327843659034923143107156940238942976892218
04858389687649685235712612880380643104425852839332564045727486066401513073768002507254
27496845607662821346676098703361000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000
The digits of z are 5074

Posted by Scripter
,



* ActionScript 2.0 에 의한 소스 코드

    on(release) {
        dyntxt.text = intxt.text + "!";
    }


* ActionScript 3.0 에 의한 소스 코드

    btn.addEventListener(MouseEvent.CLICK, clickH);

    function clickH(e:MouseEvent):void {
        dyntxt.text = intxt.text + "!";
    }


-----------------------------------------------




-----------------------------------------------

 


Posted by Scripter
,

#!/usr/bin/python
# -*- encoding: latin-1 -*-  (성공)

# coding: iso-8859-1  (성공)

# -*- encoding: ascii -*-  (실패)
# -*- encoding: euc-kr -*-  (실패)

print("Hello")
print("안녕하세요?")
print(len("안녕하세요?"))


2011년 3월 11자로 배포된 Jython 2.5.2 에서 실행해 보았다.

실행> jython hello.py
Hello
안녕하세요?
11


그러나, 2011년 3월 12일에 배포된 IronPython 2.7 에서는 (아래 처럼) 한글이 출력되지 않는다. (한글이 아니라 라틴 문자가 출력된다.)



실행> ipy hello.py
Hello
¾E³cCI¼¼¿a?
11


IronPython 에서는 오히려 다음 소스 코드가  더 잘 실행된다.

#!/usr/bin/python
# coding: cp949  (성공)
# -*- encoding: euc-kr -*-  (성공)

# coding:ms949  (에러)

# coding: iso-8859-1  (실패)
# -*- encoding: latin-1 -*-  (실패)
# -*- encoding: ascii -*-  (실패)

print("Hello")
print("안녕하세요?")
print(len("안녕하세요?"))


실행> ipy hello.py
Hello
안녕하세요?
6

Posted by Scripter
,


컨솔에 문자 출력하는 ocaml 구문은

       Printf.printf "문자열(스트링)"

이다. 여기서 개행문자 "\n"을 추가하면 개행된다.
(Jython의 문자 출력 구문도 위와 같다.)
 
소스 파일명: hello.ml
------------------------------[소스 시작]
Printf.printf "%s, %s" "Hello" "world!\n";;

let name = "개똥이";;
Printf.printf "%s, %s!\n" "Hello" name;;

let name2 = ref "홍길동";;
let greeting = "안녕하세요?";;
name2 := "길동이";;
Printf.printf "%s, %s씨!\n" greeting !name2;;
------------------------------[소스 끝]


컴파일> ocamlc -o hello.exe hello.ml

실행> hello.exe
Hello, world!
Hello, 개똥이!
길동이씨! 안녕하세요?


* 또는 컴파일 옵션 -o 없이 컴파일하는 경우:
   이 때는 파일명이 ocamlprog.exe 실행파일이 생성된다.

컴파일> camlc hello.ml

실행> ocamlprog
Hello, world!
Hello, 개똥이!
길동이씨! 안녕하세요?



* 생성된 실행파일 hello.exe 는 ocamlrun 명령을 써서 실행하여도 된다.

실행> ocamlrun hello.exe
Hello, world!
Hello, 개똥이!
길동이씨! 안녕하세요?



* ocaml 명령을 사용하면 (컴파일 없이) 스크립트 소스를 바로 실행시킬 수 있다.

실행> ocaml hello.ml
Hello, world!
Hello, 개똥이!
길동이씨! 안녕하세요?



* GUI 환경에서 연습하기를 좋아한다면 OCamlWinPlus 를 사용해도 된다.




 



Posted by Scripter
,

아래의 소스는 윈도우에서

            Luna MinGW & GNU C 4.5.0 (gcc), 

로 테스트되었다. long 타입으로는 13! 까지만 정확하계 계산되지만 GMP 를 이용한 계산은 아무리 큰 수의 곱셈이라도 정확히 계산해준다.

  • 윈도우에 Luna MinGW (with GCC 4.5.0) 설치하기:
     1) Luna MinGW 홈페이지(MinGW GCC C/C++ Compiler package with installer) 
     2) Luna MinGW 설치파일 다운로드
  •  영문  위키피디아에서 소개하는 MinGW
  • MinGW 의 공식 웹사이트에서 MinGW 를 설치하면 gcc 버전이 3.4.5 밖에 되지 않고,
    gmp 라이브러리도 수동으로 설치헤야 하는 번거로움이 있으므로,
    여기서는 Luna MinGW 를 설치하기로 한다. Luna MinGW 를 설치하면,
    현재 최신 버전인 gcc4.5.0 을 쓸 수 있다. 그 대신 g++ 로 컴파일 후에 쓰일 런타임 다이나믹  라이브러리 libgmpxx-4.dll 은 별도로 구하여 설치해야 한다.
  • 윈도우에 Luna MinGW (with GCC 4.5.0) 설치하기:
        * Luna MinGW 홈페이지(MinGW GCC C/C++ Compiler package with installer) 
        * Luna MinGW 설치파일 다운로드
    1) 설치는 C:\MinGW 에 한것으로 간주한다.
    2) gcc 에서 gmp 라이브러리는 추가 설치 없이 바로 쓸 수 있는데,
        g++ 로는 컴파일은 되지만 컴파일된 실행파일을 실행하면 
        limgmpxx-4.dll 파일이 없다고 에러가 날 것이다. 이때는 아래 처럼 
        limgmpxx-4.dll 파일을 컴파일해서 만들던가 이미 만들어진 것을 PATH 가 걸려 있는 곳에 넣어두어야 한다. 아래는 limgmpxx-4.dll 파일을 구할 수 있는 곳이다. 
  • g++에서 gmp를 사용하기 위해 libgmpxx-4.dll 구하여 설치하기:
       * 소스포지에서 libgmpxx-5.0.1-1-mingw32-dll-4.tar.lzma 다운로드하기
    1)  확장명이 lzma 인 파일은 7zip 으로 풀어야 한다. (7zip 은 http://www.7-zip.org 에서 구한다.)
    2) 위의 파일을 받아서 7zip으로 압축 해제하여 libgmpxx-4.dll 을  C:\MinGW\bin 에 복사힌다.  (C:\MinGW 은 Luna MinGW 가 설치된 디렉토리이다)
  • gcc 버전 확인하기
    프롬프트> gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.0/lto-wrapper.exe
    Target: mingw32
    Configured with: ../gcc-4.5.0/configure --enable-languages=c,c++,ada,fortran,obj
    c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo
    mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r
    untime-libs --disable-werror --build=mingw32 --prefix=/mingw
    Thread model: win32
    gcc version 4.5.0 (GCC)
  • g++ 버전 확인하기
    프롬프트> g++ -v
    Using built-in specs.
    COLLECT_GCC=g++
    COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.0/lto-wrapper.exe
    Target: mingw32
    Configured with: ../gcc-4.5.0/configure --enable-languages=c,c++,ada,fortran,obj
    c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo
    mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r
    untime-libs --disable-werror --build=mingw32 --prefix=/mingw
    Thread model: win32
    gcc version 4.5.0 (GCC)



    * 소스 파일명: recFactGMPcpp01.cc

/*
 *  Filename: recFactGMPcpp01.cc
 *
 *  Compile: g++ -o recFactGMPcpp01 recFactGMPcpp01.cc -lgmpxx -lgmp
 */

#include <iostream>
#include <gmpxx.h>

using namespace std;

mpz_class factorial(int n) {
    static mpz_class v;
    v = 1;
    for (int i = 1; i <= n; i++) {
     v = v*i;
    }
    return v;
}

int main(int argc, char *argv[]) {
    int n1 = 9;
    int n2 = 30;
    for (int i = n1; i <= n2; i++) {
        cout << i << "! = " << factorial(i) << endl;
        if (i == 13)
            cout << "-- below calc are regular ----" << endl;
    }
    return 0;
}




실행 결과:
프롬프트> recFactGMPcpp01
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
-- below calc are regular ----
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000



Posted by Scripter
,

아래의 소스는 윈도우에서

            Luna MinGW & GNU C 4.5.0 (gcc), 

로 테스트되었다. long 타입으로는 13! 까지만 정확하계 계산되지만 GMP 를 이용한 계산은 아무리 큰 수의 곱셈이라도 정확히 계산해준다.


* 소스 파일명: recFactGMP01.c

/*
 *  Filename: recFactGMP01.c
 *
 *  Compile: gcc -o recFactGMP01 recFactGMP01.c -lgmp
 */

#include <stdio.h>
#include <gmp.h>

void factorial(mpz_t v, int n) {
 int i;
    mpz_t t;
    mpz_init (t);
    mpz_init_set_str (v, "1", 0);
    for (i = 1; i <= n; i++) {
        mpz_init_set_si (t, i);
        mpz_mul(v, v, t);
    }
}

int main(int argc, char *argv[]) {
    int n1 = 9;
    int n2 = 30;
    int i;
    mpz_t v;
    mpz_init (v);
    for (i = n1; i <= n2; i++) {
        mpz_init_set_si (v, 1);
        factorial(v, i);
        gmp_printf("%d! = %Zd\n", i, v);
        if (i == 13)
        printf("-- below calc are regular ----\n");
    }
    return 0;
}



실행 결과:
프롬프트> recFactGMP01
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
-- below calc are regular ----
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000



Posted by Scripter
,

F# 프로그램으로 버튼의  마우스 이벤트를 감지하여 버튼의 색깔을 변경하는 윈도우폼 애플리케이션을 작성해 보았다.  실행시키고 버튼을 클릭할 때마다 버튼의 색깔이 바뀐다.


// Filename: ClickForm5.fs
//
// Compile: fsc --codepage:949 ClickForm5.fs
// Execute: ClickForm5

// Import useful .NET namespaces
open System
open System.Drawing
open System.Windows.Forms

// Create the form and a label objects
let frm = new Form(Text = "버튼 이벤트 핸들러 테스트", Height = 200)
let btn = new Button(Text = "여기를 클릭!", Width=240, Height=60,
                    TextAlign = ContentAlignment.MiddleCenter)
let displaybox = new Label(Width=260, Height=35,
                    TextAlign = ContentAlignment.MiddleLeft)

// Set ‘Font’ property of the label and add label to the form
btn.Font <- new Font("궁서체", 24.0f)
btn.Location <- new System.Drawing.Point(25, 80)
displaybox.BackColor <- Color.FromArgb(255, 255, 255)
displaybox.Font <- new Font("돋움체", 13.0f)
displaybox.Location <- new Point(15, 20)
frm.Controls.Add(btn)
frm.Controls.Add(displaybox)
frm.Show()

// Create random number generator
let rnd = new Random()  

// Function that changes the text of the label and back color of the form
let handleClick (e:EventArgs) =
    let r = rnd.Next(256)
    let g = rnd.Next(256)
    let b = rnd.Next(256)
    // Set the text and the new back color
    btn.Text <- if (btn.Text = "틱!") then "택!" elif (btn.Text = "택!") then "톡!" else "틱!"
    btn.BackColor <- Color.FromArgb(r, g, b)
    displaybox.Text <- String.Format("(R, G, B) = ({0}, {1}, {2})", r, g, b)

btn.Click.Add(handleClick)

do
  Application.Run(frm)



 

                           <실행하여 마우스를 몇 번 클릭한 화면>



크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,

아래의 소스는

            Visual Studio 2010 Express (Visual C++ 10.0),
            MinGW & GNU C 3.4.5 (gcc), 

로 테스트되었다. long 타입의 한계로 인하여 13! 까지만 정확히 계산되었다.

* 소스 파일명: recursiveFactorial.c

#include <stdio.h>

long recFacto(long y, int k, int n) {
    if (n <= 1)
        return 1L;
    else if (k == n)
        return y;
    return recFacto(y*(k+1), k+1, n);
}

long factorial(int n) {
    return recFacto(1L, 1, n);
}

int main(int argc, char *argv[]) {
    int n = 20;
    int i;
    for (i = 0; i <= n; i++) {
        printf("%d! = %ld\n", i, factorial(i));
        if (i == 13)
         printf("-- below calc are fault ----\n");
    }
}




실행 결과:
프롬프트> recursiveFactorial
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 1932053504
-- below calc are fault ----
14! = 1278945280
15! = 2004310016
16! = 2004189184
17! = -288522240
18! = -898433024
19! = 109641728
20! = -2102132736



크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,


F# 프로그램으로 마우스 이벤트를 감지하는 간단한 윈도우폼 애플리케이션을 작성해 보았다.
실행시키고 라벨이 았는 곳을 클릭하면 클릭 횟수가 하나씩 증가한다.
 

(*
 * Filename: TestMouseDownEvent.fs
 *
 *   Compile: fsc TestMouseDownEvent.fs
 *   Execute: TestMouseDownEvent
 *
 *   Date: 2010/07/23
 *   Author: phkim  pkim __AT__ scripts.pe.kr
 *)

open System
open System.Drawing
open System.Windows
open System.Windows.Forms

// Creates the user interface
let frm, lbl = new Form (), new Label()

frm.Width <- 300
frm.Height <- 300
frm.FormBorderStyle <- FormBorderStyle.Fixed3D
frm.Text <- "Test of MouseDown Event"

lbl.Size <- new System.Drawing.Size(200,30)
lbl.TextAlign <- ContentAlignment.MiddleLeft
lbl.Location <- new System.Drawing.Point(20,40)
lbl.Text <- "Click here"
lbl.ForeColor <- Color.DarkGreen
// lbl.Font <- new Font("verdana", 12.0f, FontStyle.Bold)
lbl.Font <- new Font("Lucida Console",10.0f,FontStyle.Bold)
lbl.BackColor <- Color.AliceBlue

frm.Controls.Add(lbl)

let rec loop(count) = async {
  let! args = Async.AwaitEvent(lbl.MouseDown)  // Wait for mouse down
  lbl.Text <- sprintf "Clicks: %d" count
  return! loop(count + 1) }

do
  Async.Start(loop(1))
  Application.Run(frm)




                                  <실행하여 마우스를 몇 번 클릭한 화면>


크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,


* 꼬리 재귀호출과 패턴 매칭을 이용하여 구현한 팩토리얼과 피보나치 수열 계산

(*
    Filename: fact.fs
         Rapid factorial and fibonacci seq implementations
         by pattern matching and tail recursive call

    Compile: fsc fact.fs
    Execute: fact

    Date: 2010/07/20
    Author: phkim  pkim __AT__ scripts.pe.kr
*)

#light

let rec fact (n:int) : bigint =
    match n with
    | 0 | 1    -> 1I
    | k        -> (bigint k) * (fact (k-1))

let factorial n =
    let rec loop acc k =
          match k with
          | 0 -> acc
          | _ -> loop (acc*(bigint k)) (k - 1)
    loop 1I n

let fibonacci n =
    let rec loop a b k =
          match k with
          | 0 -> a
          | _ -> loop (a + b) a (k - 1)
    loop 0I 1I n

let a = 30000
let b = 200000
printfn "Factorial(%O) has %O digits" a ((sprintf "%O" (factorial a)).Length)
printfn "Fibonacci(%O) has %O digits" b ((sprintf "%O" (fibonacci b)).Length)
(*
    Expected result:
    Factorial(30000) has 121288 digits
    Fibonacci(200000) has 41798 digits
*)

 

 


 

Posted by Scripter
,