從台大 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 版上, 有網友提供了一個網址,包含了幾個語言的測試數據,網址在這裡
一月 30, 2009 於 11:12 午後 |
請問memset這是什麼函式呀?
a[j] *= i; (a[i]不會是0嗎?)
可以請問這隻程式要改寫道java該怎麼寫呢?
最近作程式邏輯的問題
希望您可以幫幫我 謝謝
二月 7, 2009 於 5:46 午後 |
memset() 是c語言的一個函數,在這裡是用來將陣列 a 的 2048 個空間都設定為 0 (進行初始化)
可以改為 java 版是沒有問題,只要了解 sizeof(a)/sizeof(a[0])的意思就可以改寫了