處理很長的數 加/乘法函式 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
處理很長的數 加/乘法函式作者:錢滄海 有時程式要處理很大的數,而且需要完全精確的值,這時double和float都派不上用場囉..這時只能靠陣列儲存BCD的數字型態囉..這裡提供加/乘法最大4096位的計算函式.. < class="code"> /* 發信人: newmike@pivot (pig), 信區: NCHU-WSC 標 題: 【長整數的加法與乘法】 */ /* 程式名稱 : addlint.c */ /* 目的 : 求兩個長整數相加的結果 */ /* 設計者 : 錢滄海 Chien, Chang-hai */ /* 設計日期 : 12-03-1994 (紀念第一屈省長民選而作) */ #include < stdio.h > #include < string.h > #define MAX_DIGITS 4096 /* 如果不夠長可以改這一列 */ void main(void) { char a[MAX_DIGITS 1], b[MAX_DIGITS 1], result[MAX_DIGITS 2], *num_1, *num_2; int i, carry, temp, str_length_1, str_length_2; printf("請輸入兩個長整數(** 請勿超過 %d 位 **)\n", MAX_DIGITS); gets(a); gets(b); str_length_1 = strlen(a); str_length_2 = strlen(b); if(str_length_1 > str_length_2) { temp = str_length_1; str_length_1 = str_length_2; str_length_2 = temp; num_1 = b; num_2 = a; } else { num_1 = a; num_2 = b; } strrev(num_1); strrev(num_2); for(carry = 0, i = 0; i < str_length_1; i ) { temp = (num_1[i] - '0') (num_2[i] - '0') carry; result[i] = (temp % 10) '0'; carry = temp / 10; } for(i = str_length_1; i < str_length_2; i ) { temp = (num_2[i] - '0') carry; result[i] = (temp % 10) '0'; carry = temp / 10; } if(carry == 0) { result[str_length_2] = '\0'; } else { result[str_length_2] = carry '0'; result[str_length_2 1] = '\0'; } strrev(a); strrev(b); strrev(result); printf("%*s\n", str_length_2 3, a); printf(" )%*s\n", str_length_2 1, b); for(i = 0; i < str_length_2 3; i ) printf("-"); printf("\n%*s\n", str_length_2 3, result); } /* 程式名稱 : timelint.c */ /* 目的 : 求兩個長整數相乘的結果 */ /* 設計者 : 錢滄海 Chien, Chang-hai */ /* 設計日期 : 12-03-1994 (紀念第一屈省長民選而作) */ #include < stdio.h > #include < string.h > #define MAX_DIGITS 4096 /* 如果不夠長可以改這一列 */ void main(void) { char a[MAX_DIGITS 1], b[MAX_DIGITS 1], result[2 * MAX_DIGITS 1], *num_1, *num_2; int i, j, carry, temp, str_length_1, str_length_2; printf("請輸入兩個長整數(** 請勿超過 %d 位 **)\n", MAX_DIGITS); gets(a); gets(b); str_length_1 = strlen(a); str_length_2 = strlen(b); if(str_length_1 > str_length_2) { temp = str_length_1; str_length_1 = str_length_2; str_length_2 = temp; num_1 = b; num_2 = a; } else { num_1 = a; num_2 = b; } strrev(num_1); strrev(num_2); for(i = 0; i < str_length_1 str_length_2 - 1; i ) result[i] = '0'; for(i = 0; i < str_length_1; i ) { for(carry = 0, j = 0; j < str_length_2; j ) { temp = (num_1[i] - '0') * (num_2[j] - '0') (result[i j] - '0') carry; result[i j] = (temp % 10) '0'; carry = temp / 10; } } if(carry == 0) { result[str_length_1 str_length_2 - 1] = '\0'; } else { result[str_length_1 str_length_2 - 1] = carry '0'; result[str_length_1 str_length_2] = '\0'; } strrev(a); strrev(b); strrev(result); printf("%*s\n", str_length_1 str_length_2 2 , a); printf("x)%*s\n", str_length_1 str_length_2 , b); for(i = 0; i < str_length_1 str_length_2 2; i ) printf("-"); printf("\n%*s\n", str_length_1 str_length_2 2, result); } /* ┌--------┐ │ RESULT │ └--------┘ D:\TC>addlint 請輸入兩個長整數(** 請勿超過 4096 位 **) 2892349002340023490123897278989289892389182348423894829389234203992323 33848374374920310919271232871836110201928718237838749349394939943934 2892349002340023490123897278989289892389182348423894829389234203992323 ) 33848374374920310919271232871836110201928718237838749349394939943934 ------------------------------------------------------------------------- 2926197376714943801043168511861126002591111066661733578738629143936257 D:\TC>timelint 請輸入兩個長整數(** 請勿超過 4096 位 **) 2389293023094993450020348293402349 248829392994884052237378271873132 2389293023094993450020348293402349 x) 248829392994884052237378271873132 --------------------------------------------------------------------- 573506130412438603201678465666068515396354853146965059073558787068 */ 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/12/11 19:13:26 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |