天文數(shù)的階乘計(jì)算

字號(hào):

在C語(yǔ)言里unsigned long int型的的整數(shù)的僅可表示0~4294967295之間的數(shù),而12! = 479001600,13! = 6227020800??梢?jiàn),用unsigned long int型的整數(shù)做階乘運(yùn)算時(shí)最多只能計(jì)算到12的階乘。用函數(shù)double sqrt(double x)做開(kāi)方算運(yùn)算時(shí),只能計(jì)算到16位有效數(shù)字。long double型的實(shí)數(shù)雖然可表示10-4931~10-4932的數(shù),但其有效數(shù)字也只有18~19位。
    我編寫(xiě)了一個(gè)“天文數(shù)字計(jì)算”程序突破了這一限制,可以把數(shù)字的長(zhǎng)度擴(kuò)充到無(wú)窮多位。除了能做加、減、乘、除、求模等基本運(yùn)算外還可以做階乘、乘方、開(kāi)平方等運(yùn)算。
    例如:10000! = ?、(2002^2000)%9999 = 9394、2002的平方根的小數(shù)點(diǎn)后第10000位是4。
    下面這個(gè)程序只是我用編寫(xiě)的“天文數(shù)字計(jì)算”里的一個(gè)計(jì)算。
    因?yàn)樵诔绦虼a中使用了中文,所以這個(gè)程序如果不在中文DOS下運(yùn)行,可能會(huì)出現(xiàn)亂碼,但不影響程序的計(jì)算結(jié)果。
    注:因?yàn)镈OS能訪(fǎng)問(wèn)的內(nèi)存有限,所以在DOS下可把計(jì)算結(jié)果擴(kuò)充到30000多位。但如果用VC把它編繹成Windows程序,則可以計(jì)算到“真正的無(wú)窮多位”(與機(jī)子配置有關(guān)),一般計(jì)算到幾十萬(wàn)位是沒(méi)有問(wèn)題的。
    /* 此程序在TC2.0、TC3.0,BC,VC下都可編繹 */
    #define M 20000 /* 結(jié)果位數(shù),DOS能訪(fǎng)問(wèn)的內(nèi)存有限,不要超過(guò) 30000 位*/
    #define N (M+5)
    main()
    {
    int Num;
    reGISter int i,j,k,flag;
    register unsigned int n,m,pc;
    unsigned char str_n[5],result_0[N],result_1[N];
    void fun_print_result(char *result,int flag);
    int fun_mul(char *a,char *b,char *c,int flag);
    printf("輸入計(jì)算其階乘的數(shù):Num = ");
    scanf("%d",&Num);
    if(Num >= 100)
    {
    printf( "\n正在進(jìn)行階乘運(yùn)算. . .\n");
    printf( "已完成 00000 的階乘,請(qǐng)等待. . .");
    }
    for (j=0;j    {
    result_1[j] = 0; result_0[j] = 0;
    }
    result_1[N-1] = 1;
    for(i=0;i <5;i++)
    {
    str_n[i] = 0;
    }
    n = 1;
    pc = 0; flag = N-1;
    while (n <= Num)
    {
    m = n;
    k = 4;
    while(m > 0)
    {
    str_n[k] = m%10; m /= 10; k--;
    }
    if (pc%2 == 0)
    {
    if(fun_mul (str_n,result_1,result_0,flag) != 1)
    {
    printf( "\n\n結(jié)果溢出!當(dāng)前所設(shè)置的結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
    exit(0);
    }
    }
    else
    {
    if(fun_mul (str_n,result_0,result_1,flag) != 1)
    {
    printf( "\n\n結(jié)果溢出!當(dāng)前所設(shè)置的結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
    exit(0);
    }
    }