#0 為什麼稱作玩具程式?
1、實現簡單,也就是效率一般。
2、只具備無符號數的加、乘運算功能。
#1 如何實現
以1792為例,用陣列0號元素儲存2,1號元素儲存9,依此類推...
下面是大整數的儲存結構圖。
儲存結構定義:
1#define maxdigits 64
23 typedef struct bignum;
加法實現:按位相加,再加上進製carry。兩個數長度未必相同,所以高位的處理需要特別對待。
乘法實現:乘法其實是用加法來實現的,下面列出了偽碼實現。
1int multiplybignum(bignum * src, bignum * dst)
1011 copybignum(&result, src);
1213
return
0;14 }
#2 除了初始化bigint外沒有
除法、求餘 運算:我構造了查詢表,但這也使得程式**變得更長了。
查詢表的構造過程:寫幾行輸出**,控制台輸入輸出重定向,拷貝粘帖。如果是手工的話,很可能會出錯。
1 unsigned char cachemgr[96][2]=;
#3 階乘運算31!,改下引數運算256!也行的, 執行時間也會長些
1int main()
1213 getchar();
14return
0;15 }
#4 更多參考
顯然,高精度數值運算程式庫的編寫可以稱得上相當professional的工作!如果你想動手,最好找些幫手。有遞迴實現。有四則運算的完整實現。有齊全的綜述。沒看過,但顯然裡面會有權威的描述,必然會有的,哈哈。
eric s. roberts. programming abstractions in c: a second course in computer science. addison-wesley educational publishers inc.
steven s. skiena miguel a. revilla. programming challenges. springer verlag. ch5.2 high-precision integers.
steven s. skiena. the algorithm design manual, second edition. springer-verlag. ch13.9 arbitrary-precision arithmetic.
d. knuth. the art of computer programming, volume 2: seminumerical algorithms. addison-wesley, reading ma, third edition, 1997.
#5 **參考,拍磚請輕點下手
1 #include
2 #include "
bigint.h"3
#define maxdigits 64
45 typedef struct bignum;910
int makebignum(int src, bignum * bn)
1718
return
0;19 }
2021
int printfbignum(bignum * bn)
2627 printf("
\n");
2829
return
0;30 }
3132
int addbignum(bignum * src, bignum * dst);
3940 bignum * longnum = src;
41int shortlength = dst->lastdigit;
42if(dst->lastdigit > src->lastdigit)
46int length = longnum->lastdigit;
4748
int carry = 0;
49for (int i=0; i<=shortlength; i++)
5455
for (int i=shortlength+1; i<=length; i++)
6061
if (carry == 1)
65else src->lastdigit = longnum->lastdigit;
6667
return
0;68 }
6970
//src *****> dst
71int copybignum(bignum * src, bignum * dst)
8182
int multiplydigit(bignum * src, unsigned char digit, bignum * t);
105106
int carry = 0;
107int length = src->lastdigit;
108int x;
109110
for(int i=0; i<=length; i++)
116117
if (carry > 0)
121122
return
0;123 }
124125
int multiplybignum(bignum * src, bignum * dst)
139140 copybignum(&result, src);
141142
return
0;143 }
144145
int main()
156157 getchar();
158return
0;159 }
bigint 10 和bigint 20 的區別
1 bigint 10 和bigint 20 的區別在於如果表定義加上zerofill後再客戶端顯示長度不同,如下 mariadb test create table test2 id bigint 10 zerofill,id1 bigint 20 zerofill mariadb test in...
bigInt資料型別
簡述 bigint資料型別提供了一種方法來表示大於2 53 1的整數。bigint可以表示任意大的整數 作用解決精度缺失的問題 bigint資料型別比number型別支援更大的整數值,number型別只能安全的支援 9007199254740991 2 53 1 和 9007199254740991...
bigInt與varchar索引的大小
今天晚上突然想到乙個問題 對於單個欄位的索引,用bigint和varchar做索引,bigint索引到底能減少多大?於是我建了兩張表 create table test long id bigint 20 not null,key in id engine innodb default charse...