使用c語言陣列計算 200 階層

從台大 ptt 上 Programming 版看到的,由 PaulLiu 所寫的程式版本,我在加上註解、整理縮排和小小修改之後,post 在這裡。

這個方式是使用陣列來存放整個計算的結果。

在使用 c 語言計算大數方面,除了像這樣使用陣列來處理之外,還有其他方法是連結另外專門處理大量的函式庫,像是 The GNU MP Bignum Library 或是 C++ 的 NTL 函式庫

#include <stdio.h>
int main() {
    int i,j,a[2048],N=200;
    //初始化陣列內容
    memset(a,0,sizeof(a));
    a[0]=1;
    for (i=1 ; i<=N ; i++)  {  //i 從 1 ~ 200 代表 1x2x3...x200
        //從最低位數開始計算新的結果
        for (j=0 ; j < sizeof(a)/sizeof(a[0]) ; j++) {
            a[j] *= i;
        }
        //處理數字進位
        for (j=0 ; j < sizeof(a)/sizeof(a[0])-1 ; j++) {
            a[j+1] += a[j]/10;
            a[j] %= 10;
        }
    }
    //準備列印出結果
    for (i=sizeof(a)/sizeof(a[0])-1 ; i >=0 ; i--) {
        if (a[i] != 0) break;
    }
    //印出計算完成的結果
    for ( ; i>=0 ; i--) {
        printf("%d",a[i]);
        printf("\n");
    }
}

在計算的效能方面,在台大 ptt Programming 版上, 有網友提供了一個網址,包含了幾個語言的測試數據,網址在這裡

Advertisements

4 則回應給 使用c語言陣列計算 200 階層

  1. 小松鼠 說道:

    請問memset這是什麼函式呀?

    a[j] *= i; (a[i]不會是0嗎?)

    可以請問這隻程式要改寫道java該怎麼寫呢?

    最近作程式邏輯的問題

    希望您可以幫幫我 謝謝

  2. GD 說道:

    memset() 是c語言的一個函數,在這裡是用來將陣列 a 的 2048 個空間都設定為 0 (進行初始化)

    可以改為 java 版是沒有問題,只要了解 sizeof(a)/sizeof(a[0])的意思就可以改寫了

  3. 初學者 說道:

    請問
    memset(a,0,sizeof(a));中的sizeof(a)為什麼不能直接打2048就好阿?
    sizeof(a)/sizeof(a[0]) 是什麼意思?意義是什麼我不懂…

    我是初學者很多不會的地方
    希望您可以幫我的忙
    謝謝!!

  4. 初學者 說道:

    我懂了…

    不過sizeof(a)/sizeof(a[0])-1這句是什麼意思阿?
    我還是不太了解=(

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: