日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

C语言实现大数计算器

發(fā)布時(shí)間:2023/12/20 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现大数计算器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言實(shí)現(xiàn)大數(shù)計(jì)算器

一、實(shí)驗(yàn)介紹

1.1 實(shí)驗(yàn)內(nèi)容

本實(shí)驗(yàn)通過(guò)使用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器,該計(jì)算器能夠進(jìn)行任意長(zhǎng)度的有符號(hào)整數(shù)的加、減、乘、除運(yùn)算。

1.2 實(shí)驗(yàn)知識(shí)點(diǎn)

  • c語(yǔ)言大數(shù)加法實(shí)現(xiàn)
  • c語(yǔ)言大數(shù)減法實(shí)現(xiàn)
  • c語(yǔ)言大數(shù)乘法實(shí)現(xiàn)
  • c語(yǔ)言大數(shù)除法實(shí)現(xiàn)

1.3 實(shí)驗(yàn)環(huán)境

  • vim
  • gcc 編譯器
  • Xfce終端

1.4 適合人群

本課程適合已了解C語(yǔ)言基礎(chǔ)語(yǔ)法規(guī)則,并期望通過(guò)實(shí)際編程項(xiàng)目進(jìn)行演練,以提高C語(yǔ)言編程技巧的用戶進(jìn)行學(xué)習(xí)。

1.5 代碼獲取

你可以通過(guò)下面命令將代碼下載到實(shí)驗(yàn)樓環(huán)境中,作為參照對(duì)比進(jìn)行學(xué)習(xí)。

$ wget http://labfile.oss.aliyuncs.com/courses/750/calculator_sample.tar.gz $ tar xvf calculator_sample.tar.gz

二、實(shí)驗(yàn)步驟

2.1 如何表示大數(shù)

由于C語(yǔ)言的基本數(shù)據(jù)類型在表示數(shù)字大小時(shí)都有一定的限制,所以要在C語(yǔ)言中表示一個(gè)大數(shù),有兩種方式:字符串和自行構(gòu)造數(shù)據(jù)結(jié)構(gòu)。

  • 字符串表示,適合人解讀,但不適用于機(jī)器運(yùn)算

  • 數(shù)據(jù)結(jié)構(gòu)表示,適用于機(jī)器運(yùn)算,但人對(duì)其進(jìn)行解讀比較困難

  • 我們的設(shè)計(jì),綜合考慮上述兩種方式的優(yōu)缺點(diǎn),我們自行構(gòu)造數(shù)據(jù)用于表示大數(shù)以提供給機(jī)器進(jìn)行運(yùn)算,同時(shí)提供字符串與我們構(gòu)造的數(shù)據(jù)結(jié)構(gòu)進(jìn)行互轉(zhuǎn)的輔助性函數(shù):

    // 大數(shù)數(shù)據(jù)結(jié)構(gòu) typedef struct bignumber_s{char sign; // 代表大數(shù)的符號(hào),1為負(fù)數(shù),0為正數(shù)int len; // 代表大數(shù)的位數(shù)char data[]; // 大數(shù)的數(shù)據(jù)內(nèi)容,data[0]代表個(gè)位,data[1]代表十位,data[2]代表百位.... } bignumber_s;// 構(gòu)造大數(shù)模板,len指向大數(shù)的數(shù)據(jù)位數(shù),sign表示該大數(shù)的符號(hào) bignumber_s *make_bignumber_temp(int len, int sign); // 從字符串構(gòu)造一個(gè)大數(shù) bignumber_s *make_bignumber_fromstr(const char *str); // 以字符串的形式打印輸出一個(gè)大數(shù) void print_bignumber(bignumber_s* b);

    在bignumber_s數(shù)據(jù)結(jié)構(gòu)的定義中,我們使用了C語(yǔ)言里一種稱為柔性數(shù)組的技巧,感興趣的同學(xué)可以自行研究。

    下圖演示了我們的bignumber_s如何表示"-123"這個(gè)數(shù):

    實(shí)現(xiàn)make_bignumber_temp函數(shù):

    // 構(gòu)造大數(shù)模板,len指向大數(shù)的數(shù)據(jù)位數(shù),sign表示該大數(shù)的符號(hào) bignumber_s *make_bignumber_temp(int len, int sign) {// 分配bignumber_s及其所代表數(shù)據(jù) 所需的內(nèi)存bignumber_s *temp = malloc(sizeof(bignumber_s)+len);if (NULL == temp) {perror("Malloc");exit(-1);}temp->sign = sign;temp->len = len;memset(temp->data, 0, len);return temp; }

    實(shí)現(xiàn)make_bignumber_fromstr函數(shù):

    // 從字符串構(gòu)造一個(gè)大數(shù) bignumber_s *make_bignumber_fromstr(const char *str) {// 處理負(fù)數(shù)字符串,即"-123"int sign = 0;if (str[0]=='-') {sign = 1;str++;}// 處理數(shù)字字符串冗余的0,即"00123" -> "123"const char * striped_str = strip_str(str);int len = strlen(striped_str);// 指定數(shù)據(jù)位長(zhǎng)度即符號(hào),創(chuàng)建一個(gè)大數(shù)模板bignumber_s *temp = make_bignumber_temp(len ,sign);// 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中,完成大數(shù)創(chuàng)建fill_data_fromstr(temp, striped_str);return temp; } // 處理數(shù)字字符串冗余的0,即"00123" -> "123" const char *strip_str(const char *str) {int i = 0;int len = strlen(str);for (i=0; i<len-1&&str[i]=='0'; i++) ;return str+i; } // 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中 void fill_data_fromstr(bignumber_s *n, const char *str) {int i = 0;int len = n->len;for (i=0; i<len; i++) {int d = str[len-1-i]-'0';if (d>=0 && d<=9) n->data[i] = d;else {fprintf(stderr, "Invalid Number:%s\n", str);exit(-1);}} }

    實(shí)現(xiàn)print_bignumber函數(shù):

    // 以字符串的形式打印輸出一個(gè)大數(shù) void print_bignumber(bignumber_s* b) {int len = b->len;char *str = malloc(len+1);int i = 0;for (i=0; i<len; i++) {str[i] = b->data[len-i-1]+'0';}str[len] = '\0';fprintf(stdout,"%s%s\n", b->sign==1?"-":"", strip_str(str));free(str); }

    2.2 實(shí)現(xiàn)計(jì)算器的殼

    我們的計(jì)算器最終編譯生成為一個(gè)名為calculator的可執(zhí)行程序,使用計(jì)算器的方法如下:

    $ ./calculator 123 + 123 # 執(zhí)行加法運(yùn)算 $ ./calculator 123 - 123 # 執(zhí)行減法運(yùn)算 $ ./calculator 123 x 123 # 執(zhí)行乘法運(yùn)算 $ ./calculator 123 / 123 # 執(zhí)行除法運(yùn)算

    實(shí)現(xiàn)我們的main函數(shù):

    void usage(const char *s) {fprintf(stderr, "Usage:%s number1 op(+-x/) number2.\n",s);exit(-1); }bignumber_s *calc_add(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)加法 } bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)減法 } bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)乘法 } bignumber_s *calc_div(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)除法 } int main(int argc, char *argv[]) {bignumber_s *a = make_bignumber_fromstr(argv[1]);bignumber_s *b = make_bignumber_fromstr(argv[3]);if (argc!=4) usage(argv[0]);if (0 == strcmp(argv[2],"+"))print_bignumber(calc_add(a,b));else if (0 == strcmp(argv[2],"-"))print_bignumber(calc_sub(a,b));else if (0 == strcmp(argv[2],"x"))print_bignumber(calc_mul(a,b));else if (0 == strcmp(argv[2],"/"))print_bignumber(calc_div(a,b));else usage(argv[0]);return 0; }

    2.3 實(shí)現(xiàn)無(wú)符號(hào)加減法

    2.3.1 實(shí)現(xiàn)無(wú)符號(hào)加法

    加法的實(shí)現(xiàn)比較簡(jiǎn)單,我們借鑒小學(xué)時(shí)學(xué)過(guò)的豎式計(jì)算過(guò)程的思路:

    思路大致是:

  • 從最低位開(kāi)始,對(duì)應(yīng)位置相加,和大于10的向高位進(jìn)位,取個(gè)位數(shù)為該位置相加的和
  • 對(duì)應(yīng)位置相加時(shí),要加上來(lái)自低位的進(jìn)位值
  • n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)
  • 實(shí)現(xiàn)無(wú)符號(hào)加法:

    #define BASE (10) #define MAX(x,y) ((x)>(y)?(x):(y)) // 實(shí)現(xiàn)無(wú)符號(hào)加法,a和b為加數(shù),r為和 void add_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i = 0;char carry = 0;int len = r->len;for (i=0; i<len; i++) {if (i<a->len)carry += a->data[i];if (i<b->len)carry += b->data[i];r->data[i] = carry%BASE;carry /= BASE;} }bignumber_s *add(bignumber_s *a, bignumber_s *b) {// n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)int len = MAX(a->len, b->len) + 1;bignumber_s *result = make_bignumber_temp(len,a->sign);// add_impl(a,b,result);return result; }

    2.3.2 實(shí)現(xiàn)無(wú)符號(hào)減法

    減法的實(shí)現(xiàn)與加法的實(shí)現(xiàn)思路相似,依舊請(qǐng)出的我們豎式計(jì)數(shù)法:

    思路大致是:

  • 從最低位開(kāi)始,對(duì)應(yīng)位置相減,不夠減的向高位借位,得到的差作為該位置的差
  • 對(duì)應(yīng)位置相減時(shí),要減去來(lái)自低位的借位值
  • n位數(shù)-m位數(shù),其和最大為n位數(shù)
  • 實(shí)現(xiàn)無(wú)符號(hào)減法:

    // 實(shí)現(xiàn)無(wú)符號(hào)減法,a-b , r為差 void sub_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i=0;int borrow = 0;int len = r->len;int temp = 0;for (i=0; i<len; i++) {temp = a->data[i]+BASE-borrow-((i<b->len)?b->data[i]:0);r->data[i] = temp%BASE;borrow = 1-temp/BASE;} }bignumber_s *sub(bignumber_s *a, bignumber_s *b) {int len = a->len;bignumber_s *result = make_bignumber_temp(len,0);sub_impl(a,b,result);return result; }

    2.3.3 大數(shù)計(jì)算器v1版本

    大數(shù)計(jì)算器v1版本:

    /* * file name : calculatorv1.c * desp : calculator version 1 */ #include <stdio.h> #include <stdlib.h> #include <string.h>#define BASE (10) #define MAX(x,y) ((x)>(y)?(x):(y))// 大數(shù)數(shù)據(jù)結(jié)構(gòu) typedef struct bignumber_s{char sign; // 代表大數(shù)的符號(hào),1為負(fù)數(shù),0為正數(shù)int len; // 代表大數(shù)的位數(shù)char data[]; // 大數(shù)的數(shù)據(jù)內(nèi)容,data[0]代表個(gè)位,data[1]代表十位,data[2]代表百位.... } bignumber_s;// 構(gòu)造大數(shù)模板,len指向大數(shù)的數(shù)據(jù)位數(shù),sign表示該大數(shù)的符號(hào) bignumber_s *make_bignumber_temp(int len, int sign) {// 分配bignumber_s及其所代表數(shù)據(jù) 所需的內(nèi)存bignumber_s *temp = malloc(sizeof(bignumber_s)+len);if (NULL == temp) {perror("Malloc");exit(-1);}temp->sign = sign;temp->len = len;memset(temp->data, 0, len);return temp; }// 處理數(shù)字字符串冗余的0,即"00123" -> "123" const char *strip_str(const char *str) {int i = 0;int len = strlen(str);for (i=0; i<len-1&&str[i]=='0'; i++) ;return str+i; } // 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中 void fill_data_fromstr(bignumber_s *n, const char *str) {int i = 0;int len = n->len;for (i=0; i<len; i++) {int d = str[len-1-i]-'0';if (d>=0 && d<=9) n->data[i] = d;else {fprintf(stderr, "Invalid Number:%s\n", str);exit(-1);}} } // 從字符串構(gòu)造一個(gè)大數(shù) bignumber_s *make_bignumber_fromstr(const char *str) {// 處理負(fù)數(shù)字符串,即"-123"int sign = 0;if (str[0]=='-') {sign = 1;str++;}// 處理數(shù)字字符串冗余的0,即"00123" -> "123"const char * striped_str = strip_str(str);int len = strlen(striped_str);// 指定數(shù)據(jù)位長(zhǎng)度即符號(hào),創(chuàng)建一個(gè)大數(shù)模板bignumber_s *temp = make_bignumber_temp(len ,sign);// 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中,完成大數(shù)創(chuàng)建fill_data_fromstr(temp, striped_str);return temp; }// 以字符串的形式打印輸出一個(gè)大數(shù) void print_bignumber(bignumber_s* b) {int len = b->len;char *str = malloc(len+1);int i = 0;for (i=0; i<len; i++) {str[i] = b->data[len-i-1]+'0';}str[len] = '\0';fprintf(stdout,"%s%s\n", b->sign==1?"-":"", strip_str(str));free(str); }void usage(const char *s) {fprintf(stderr, "Usage:%s number1 +-x/ number2.\n",s);exit(-1); }// 實(shí)現(xiàn)無(wú)符號(hào)加法,a和b為加數(shù),r為和 void add_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i = 0;char carry = 0;int len = r->len;for (i=0; i<len; i++) {if (i<a->len)carry += a->data[i];if (i<b->len)carry += b->data[i];r->data[i] = carry%BASE;carry /= BASE;} }bignumber_s *calc_add(bignumber_s *a, bignumber_s *b) {// n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)int len = MAX(a->len, b->len) + 1;bignumber_s *result = make_bignumber_temp(len, 0);// add_impl(a,b,result);return result; }// 實(shí)現(xiàn)無(wú)符號(hào)減法,a-b , r為差 void sub_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i=0;int borrow = 0;int len = r->len;int temp = 0;for (i=0; i<len; i++) {temp = a->data[i]+BASE-borrow-((i<b->len)?b->data[i]:0);r->data[i] = temp%BASE;borrow = temp/BASE?0:1;} }bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b) {int len = a->len;bignumber_s *result = make_bignumber_temp(len,0);sub_impl(a,b,result);return result; }bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)乘法return NULL; } bignumber_s *calc_div(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)除法return NULL; } int main(int argc, char *argv[]) {bignumber_s *a = make_bignumber_fromstr(argv[1]);bignumber_s *b = make_bignumber_fromstr(argv[3]);if (argc!=4) usage(argv[0]);if (0 == strcmp(argv[2],"+"))print_bignumber(calc_add(a,b));else if (0 == strcmp(argv[2],"-"))print_bignumber(calc_sub(a,b));else if (0 == strcmp(argv[2],"x"))print_bignumber(calc_mul(a,b));else if (0 == strcmp(argv[2],"/"))print_bignumber(calc_div(a,b));else usage(argv[0]);return 0; }

    2.3.4 演示

    編譯命令:

    $ gcc -o calculatorv1 calculatorv1.c

    結(jié)果演示:?

    可以使用python交互界面驗(yàn)證我們的計(jì)算結(jié)果:


    2.4 實(shí)現(xiàn)有符號(hào)加減法

    2.4.1 有符號(hào)加法

    先來(lái)看有符號(hào)的加法,假設(shè)有兩個(gè)數(shù)A和B,有符號(hào)加法分以下幾種情況:

    // 情況一:A > 0 并且 B > 0 A + B --> |A| + |B| (|A|表示求A的絕對(duì)值,下同) // 情況二:A > 0 并且 B < 0 A + B --> |A| - |B| // 情況三:A < 0 并且 B > 0 A + B --> |B| - |A| // 情況四:A < 0 并且 B < 0 A + B --> -(|B| + |A|) (此處-表示取負(fù)值)

    情況一和情況四可以用第2節(jié)的無(wú)符號(hào)加法求解,情況四在用加法求值后再取負(fù)值;情況二和情況三轉(zhuǎn)化為有符號(hào)減法操作。

    因此我們的加法函數(shù)可以這么實(shí)現(xiàn):

    bignumber_s *calc_add(bignumber_s *a, bignumber_s *b) {// 情況一和情況四if (a->sign==b->sign) {// n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)int len = MAX(a->len, b->len) + 1;bignumber_s *result = make_bignumber_temp(len,a->sign);add_impl(a,b,result);return result;} else if (a->sign == 0 && b->sign == 1) {//情況二b->sign = 0; //b數(shù)去絕對(duì)值return calc_sub(a,b);} else if (a->sign == 1 && b->sign == 0) {//情況三a->sign = 0; //a數(shù)去絕對(duì)值return calc_sub(b,a);} }

    2.4.2 有符號(hào)減法

    接下來(lái)看有符號(hào)的減法,假設(shè)有兩個(gè)數(shù)A和B,有符號(hào)減法分以下幾種情況:

    // 情況一:A > 0 并且 B > 0 A - B --> |A| - |B| (|A|表示求A的絕對(duì)值,下同) // 情況二:A > 0 并且 B < 0 A - B --> |A| + |B| // 情況三:A < 0 并且 B > 0 A - B --> -(|A| + |B|) (此處-表示取負(fù)值) // 情況四:A < 0 并且 B < 0 A - B --> |B| - |A|

    情況二和情況三可以轉(zhuǎn)化為第2節(jié)的無(wú)符號(hào)加法求解,情況三在用加法求值后再取負(fù)值;

    情況一,當(dāng)被減數(shù)大于減數(shù)時(shí),結(jié)果為正數(shù),可以直接用第2節(jié)的減法實(shí)現(xiàn)求解;

    當(dāng)被減數(shù)小于減數(shù)時(shí),結(jié)果為負(fù)數(shù),即:

    // A < B, A>=0 且B>=0 時(shí) A - B ---> -(B-A)

    情況四,將減數(shù)和被減數(shù)調(diào)換就成了情況一了。

    我們需要先實(shí)現(xiàn)一個(gè)用以判斷兩個(gè)大數(shù)大小的輔助函數(shù),用以判斷被減數(shù)和減數(shù)的大小:

    int valid_len(bignumber_s *a) {int len = a->len;int i = len-1;for (i=len-1; i>=0; i--) {if (a->data[i]==0) len--;else break;}return len; } // 判斷兩個(gè)大數(shù)的大小 // a > b 返回1 ,a<b 返回 -1 , a==b 返回0 int cmp(bignumber_s *a, bignumber_s *b) {if (a->sign==0&&b->sign==1) return 1;if (a->sign==1&&b->sign==0) return -1;int sign = a->sign;int alen = valid_len(a);int blen = valid_len(b);if (alen>blen) return (sign==1?-1:1);else if (alen<blen) return (sign==1?1:-1);else {int i = 0;int len = alen;for (i=len-1; i>=0; i--) {if (a->data[i]>b->data[i])return (sign==1?-1:1);else if (a->data[i]<b->data[i]) return (sign==1?1:-1);}return 0;} }

    有符號(hào)的減法實(shí)現(xiàn)如下:

    bignumber_s *sub(bignumber_s *a, bignumber_s *b) {// 情況一if(a->sign==0 && b->sign==0) {if (cmp(a,b)>=0) { // 被減數(shù)大于等于減數(shù),即差大于等于0時(shí)int len = a->len;bignumber_s *result = make_bignumber_temp(len,0);sub_impl(a,b,result);return result;} else { // 被減數(shù)小于減數(shù),即差小于0時(shí)int len = b->len;bignumber_s *result = make_bignumber_temp(len,1);sub_impl(b,a,result);return result;}} else if (a->sign==1 && b->sign==1) { //情況四b->sign=0; a->sign=0;return sub(b,a); //調(diào)換減數(shù)和被減數(shù),變成情況一}else if (a->sign==0 && b->sign==1) { // 情況二b->sign=0;bignumber_s *result = add(a,b);result->sign = 0;return result; } else if (a->sign==1 && b->sign==0) { // 情況三a->sign=0;bignumber_s *result = add(a,b);result->sign = 1;return result; } }

    2.4.3 大數(shù)計(jì)算器v2版本

    完整代碼如下(calculatorv2.c):

    /* * file name : calculatorv2.c * desp : calculator version 2 */ #include <stdio.h> #include <stdlib.h> #include <string.h>#define BASE (10) #define MAX(x,y) ((x)>(y)?(x):(y))// 大數(shù)數(shù)據(jù)結(jié)構(gòu) typedef struct bignumber_s{char sign; // 代表大數(shù)的符號(hào),1為負(fù)數(shù),0為正數(shù)int len; // 代表大數(shù)的位數(shù)char data[]; // 大數(shù)的數(shù)據(jù)內(nèi)容,data[0]代表個(gè)位,data[1]代表十位,data[2]代表百位.... } bignumber_s; bignumber_s *calc_add(bignumber_s *a, bignumber_s *b); bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b);// 構(gòu)造大數(shù)模板,len指向大數(shù)的數(shù)據(jù)位數(shù),sign表示該大數(shù)的符號(hào) bignumber_s *make_bignumber_temp(int len, int sign) {// 分配bignumber_s及其所代表數(shù)據(jù) 所需的內(nèi)存bignumber_s *temp = malloc(sizeof(bignumber_s)+len);if (NULL == temp) {perror("Malloc");exit(-1);}temp->sign = sign;temp->len = len;memset(temp->data, 0, len);return temp; }// 處理數(shù)字字符串冗余的0,即"00123" -> "123" const char *strip_str(const char *str) {int i = 0;int len = strlen(str);for (i=0; i<len-1&&str[i]=='0'; i++) ;return str+i; } // 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中 void fill_data_fromstr(bignumber_s *n, const char *str) {int i = 0;int len = n->len;for (i=0; i<len; i++) {int d = str[len-1-i]-'0';if (d>=0 && d<=9) n->data[i] = d;else {fprintf(stderr, "Invalid Number:%s\n", str);exit(-1);}} } // 從字符串構(gòu)造一個(gè)大數(shù) bignumber_s *make_bignumber_fromstr(const char *str) {// 處理負(fù)數(shù)字符串,即"-123"int sign = 0;if (str[0]=='-') {sign = 1;str++;}// 處理數(shù)字字符串冗余的0,即"00123" -> "123"const char * striped_str = strip_str(str);int len = strlen(striped_str);// 指定數(shù)據(jù)位長(zhǎng)度即符號(hào),創(chuàng)建一個(gè)大數(shù)模板bignumber_s *temp = make_bignumber_temp(len ,sign);// 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中,完成大數(shù)創(chuàng)建fill_data_fromstr(temp, striped_str);return temp; }// 以字符串的形式打印輸出一個(gè)大數(shù) void print_bignumber(bignumber_s* b) {int len = b->len;char *str = malloc(len+1);int i = 0;for (i=0; i<len; i++) {str[i] = b->data[len-i-1]+'0';}str[len] = '\0';fprintf(stdout,"%s%s\n", b->sign==1?"-":"", strip_str(str));free(str); }void usage(const char *s) {fprintf(stderr, "Usage:%s number1 +-x/ number2.\n",s);exit(-1); }// 實(shí)現(xiàn)無(wú)符號(hào)加法,a和b為加數(shù),r為和 void add_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i = 0;char carry = 0;int len = r->len;for (i=0; i<len; i++) {if (i<a->len)carry += a->data[i];if (i<b->len)carry += b->data[i];r->data[i] = carry%BASE;carry /= BASE;} }bignumber_s *calc_add(bignumber_s *a, bignumber_s *b) {// 情況一和情況四if (a->sign==b->sign) {// n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)int len = MAX(a->len, b->len) + 1;bignumber_s *result = make_bignumber_temp(len,a->sign);add_impl(a,b,result);return result;} else if (a->sign == 0 && b->sign == 1) {//情況二b->sign = 0; //b數(shù)去絕對(duì)值return calc_sub(a,b);} else if (a->sign == 1 && b->sign == 0) {//情況三a->sign = 0; //a數(shù)去絕對(duì)值return calc_sub(b,a);} }// 實(shí)現(xiàn)無(wú)符號(hào)減法,a-b , r為差 void sub_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i=0;int borrow = 0;int len = r->len;int temp = 0;for (i=0; i<len; i++) {temp = a->data[i]+BASE-borrow-((i<b->len)?b->data[i]:0);r->data[i] = temp%BASE;borrow = temp/BASE?0:1;} }int valid_len(bignumber_s *a) {int len = a->len;int i = len-1;for (i=len-1; i>=0; i--) {if (a->data[i]==0) len--;else break;}return len; } // 判斷兩個(gè)大數(shù)的大小 // a > b 返回1 ,a<b 返回 -1 , a==b 返回0 int cmp(bignumber_s *a, bignumber_s *b) {if (a->sign==0&&b->sign==1) return 1;if (a->sign==1&&b->sign==0) return -1;int sign = a->sign;int alen = valid_len(a);int blen = valid_len(b);if (alen>blen) return (sign==1?-1:1);else if (alen<blen) return (sign==1?1:-1);else {int i = 0;int len = alen;for (i=len-1; i>=0; i--) {if (a->data[i]>b->data[i])return (sign==1?-1:1);else if (a->data[i]<b->data[i]) return (sign==1?1:-1);}return 0;} }bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b) {// 情況一if(a->sign==0 && b->sign==0) {if (cmp(a,b)>=0) { // 被減數(shù)大于等于減數(shù),即差大于等于0時(shí)int len = a->len;bignumber_s *result = make_bignumber_temp(len,0);sub_impl(a,b,result);return result;} else { // 被減數(shù)小于減數(shù),即差小于0時(shí)int len = b->len;bignumber_s *result = make_bignumber_temp(len,1);sub_impl(b,a,result);return result;}} else if (a->sign==1 && b->sign==1) { //情況四b->sign=0; a->sign=0;return calc_sub(b,a); //調(diào)換減數(shù)和被減數(shù),變成情況一}else if (a->sign==0 && b->sign==1) { // 情況二b->sign=0;bignumber_s *result = calc_add(a,b);result->sign = 0;return result; } else if (a->sign==1 && b->sign==0) { // 情況三a->sign=0;bignumber_s *result = calc_add(a,b);result->sign = 1;return result; } }bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)乘法return NULL; } bignumber_s *calc_div(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)除法return NULL; } int main(int argc, char *argv[]) {bignumber_s *a = make_bignumber_fromstr(argv[1]);bignumber_s *b = make_bignumber_fromstr(argv[3]);if (argc!=4) usage(argv[0]);if (0 == strcmp(argv[2],"+"))print_bignumber(calc_add(a,b));else if (0 == strcmp(argv[2],"-"))print_bignumber(calc_sub(a,b));else if (0 == strcmp(argv[2],"x"))print_bignumber(calc_mul(a,b));else if (0 == strcmp(argv[2],"/"))print_bignumber(calc_div(a,b));else usage(argv[0]);return 0; }

    2.4.4 演示

    編譯命令:

    $ gcc -o calculatorv2 calculatorv2.c

    結(jié)果演示:

    2.5 實(shí)現(xiàn)乘法

    2.5.1 正數(shù)乘法實(shí)現(xiàn)

    乘法的實(shí)現(xiàn)稍微比加減法復(fù)雜一些,但是和加減法是同樣的實(shí)現(xiàn)原理。

    依舊搬出我們的豎式計(jì)算法:

    假設(shè)x[0...n]乘以y[0...m],其中0代表x數(shù)的個(gè)位,n代表x數(shù)的最高位,假設(shè)用x代表上述的145這個(gè)數(shù)。那么x[0]就是5, x[1]就是4, x[1]就是1; 類似的y代表12, 則y[0]為2, y[1]為1。

    乘法的實(shí)現(xiàn)思路:

  • x與y的積,位數(shù)為n+m,即積為z[0...n+m]
  • 先用y的每個(gè)位去乘以x,如上述例子先用2乘以145,再用1乘以145, 從而得出對(duì)應(yīng)于y每個(gè)位的積。
  • 再將步驟2計(jì)算出來(lái)的所有積,按其基數(shù)累加到積中。
  • 這里有兩點(diǎn)需要注意:

  • y[i]乘以x[j]時(shí),其積應(yīng)在z[i+j]。
  • y[i]乘以x[0...n]其積,應(yīng)累加到z[i...m+n]中
  • 代碼實(shí)現(xiàn)如下:

    void mul_impl(bignumber_s *x, bignumber_s *y, bignumber_s *z) {int n = x->len;int m = y->len;int i = 0;int j = 0;int carry = 0;for (i=0; i<m; i++) {// y的每一位乘以x,即計(jì)算y[i] * x[0...n] 并累加到z[i...i+n]中for (j=0; j<n; j++) {carry += y->data[i]*x->data[j] + z->data[i+j];z->data[i+j] = carry%BASE;carry /= BASE;}// 將剩余的進(jìn)位,繼續(xù)在z[i+n...n+m]中累加,從而完成y[i]乘以x[0...n]其積累加到z[i...m+n]中for (; j+i<n+m; j++) {carry += z->data[i+j];z->data[i+j] = carry % BASE;carry /= BASE;}} }bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {int len = a->len + b->len;bignumber_s *result = make_bignumber_temp(len,0);mul_impl(a,b,result);return result; }

    2.5.2 有符號(hào)乘法

    有符號(hào)的 乘法可以轉(zhuǎn)化為無(wú)符號(hào)的乘法,分以下兩種情況:

    // 情況一 (A>0 && B>0) 或者 (A>0 && B>0) A x B --> |A| x |B| // 情況二 (A>0 && B<0) 或者 (A<0 && B>0) A x B --> -(|A| x |B|)

    代碼實(shí)現(xiàn)如下:

    bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {int len = a->len + b->len;bignumber_s *result = make_bignumber_temp(len,a->sign==b->sign?0:1); //a->sign==b->sign為情況一,否則為情況二。mul_impl(a,b,result);return result; }

    2.5.3大數(shù)計(jì)算器v3版本

    /* * file name : calculatorv3.c * desp : calculator version 3 */ #include <stdio.h> #include <stdlib.h> #include <string.h>#define BASE (10) #define MAX(x,y) ((x)>(y)?(x):(y))// 大數(shù)數(shù)據(jù)結(jié)構(gòu) typedef struct bignumber_s{char sign; // 代表大數(shù)的符號(hào),1為負(fù)數(shù),0為正數(shù)int len; // 代表大數(shù)的位數(shù)char data[]; // 大數(shù)的數(shù)據(jù)內(nèi)容,data[0]代表個(gè)位,data[1]代表十位,data[2]代表百位.... } bignumber_s;bignumber_s *calc_add(bignumber_s *a, bignumber_s *b); bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b);// 構(gòu)造大數(shù)模板,len指向大數(shù)的數(shù)據(jù)位數(shù),sign表示該大數(shù)的符號(hào) bignumber_s *make_bignumber_temp(int len, int sign) {// 分配bignumber_s及其所代表數(shù)據(jù) 所需的內(nèi)存bignumber_s *temp = malloc(sizeof(bignumber_s)+len);if (NULL == temp) {perror("Malloc");exit(-1);}temp->sign = sign;temp->len = len;memset(temp->data, 0, len);return temp; }// 處理數(shù)字字符串冗余的0,即"00123" -> "123" const char *strip_str(const char *str) {int i = 0;int len = strlen(str);for (i=0; i<len-1&&str[i]=='0'; i++) ;return str+i; } // 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中 void fill_data_fromstr(bignumber_s *n, const char *str) {int i = 0;int len = n->len;for (i=0; i<len; i++) {int d = str[len-1-i]-'0';if (d>=0 && d<=9) n->data[i] = d;else {fprintf(stderr, "Invalid Number:%s\n", str);exit(-1);}} } // 從字符串構(gòu)造一個(gè)大數(shù) bignumber_s *make_bignumber_fromstr(const char *str) {// 處理負(fù)數(shù)字符串,即"-123"int sign = 0;if (str[0]=='-') {sign = 1;str++;}// 處理數(shù)字字符串冗余的0,即"00123" -> "123"const char * striped_str = strip_str(str);int len = strlen(striped_str);// 指定數(shù)據(jù)位長(zhǎng)度即符號(hào),創(chuàng)建一個(gè)大數(shù)模板bignumber_s *temp = make_bignumber_temp(len ,sign);// 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中,完成大數(shù)創(chuàng)建fill_data_fromstr(temp, striped_str);return temp; }// 以字符串的形式打印輸出一個(gè)大數(shù) void print_bignumber(bignumber_s* b) {int len = b->len;char *str = malloc(len+1);int i = 0;for (i=0; i<len; i++) {str[i] = b->data[len-i-1]+'0';}str[len] = '\0';fprintf(stdout,"%s%s\n", b->sign==1?"-":"", strip_str(str));free(str); }void usage(const char *s) {fprintf(stderr, "Usage:%s number1 +-x/ number2.\n",s);exit(-1); }// 實(shí)現(xiàn)無(wú)符號(hào)加法,a和b為加數(shù),r為和 void add_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i = 0;char carry = 0;int len = r->len;for (i=0; i<len; i++) {if (i<a->len)carry += a->data[i];if (i<b->len)carry += b->data[i];r->data[i] = carry%BASE;carry /= BASE;} }bignumber_s *calc_add(bignumber_s *a, bignumber_s *b) {// 情況一和情況四if (a->sign==b->sign) {// n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)int len = MAX(a->len, b->len) + 1;bignumber_s *result = make_bignumber_temp(len,a->sign);add_impl(a,b,result);return result;} else if (a->sign == 0 && b->sign == 1) {//情況二b->sign = 0; //b數(shù)去絕對(duì)值return calc_sub(a,b);} else if (a->sign == 1 && b->sign == 0) {//情況三a->sign = 0; //a數(shù)去絕對(duì)值return calc_sub(b,a);} }// 實(shí)現(xiàn)無(wú)符號(hào)減法,a-b , r為差 void sub_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i=0;int borrow = 0;int len = r->len;int temp = 0;for (i=0; i<len; i++) {temp = a->data[i]+BASE-borrow-((i<b->len)?b->data[i]:0);r->data[i] = temp%BASE;borrow = temp/BASE?0:1;} }int valid_len(bignumber_s *a) {int len = a->len;int i = len-1;for (i=len-1; i>=0; i--) {if (a->data[i]==0) len--;else break;}return len; } // 判斷兩個(gè)大數(shù)的大小 // a > b 返回1 ,a<b 返回 -1 , a==b 返回0 int cmp(bignumber_s *a, bignumber_s *b) {if (a->sign==0&&b->sign==1) return 1;if (a->sign==1&&b->sign==0) return -1;int sign = a->sign;int alen = valid_len(a);int blen = valid_len(b);if (alen>blen) return (sign==1?-1:1);else if (alen<blen) return (sign==1?1:-1);else {int i = 0;int len = alen;for (i=len-1; i>=0; i--) {if (a->data[i]>b->data[i])return (sign==1?-1:1);else if (a->data[i]<b->data[i]) return (sign==1?1:-1);}return 0;} }bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b) {// 情況一if(a->sign==0 && b->sign==0) {if (cmp(a,b)>=0) { // 被減數(shù)大于等于減數(shù),即差大于等于0時(shí)int len = a->len;bignumber_s *result = make_bignumber_temp(len,0);sub_impl(a,b,result);return result;} else { // 被減數(shù)小于減數(shù),即差小于0時(shí)int len = b->len;bignumber_s *result = make_bignumber_temp(len,1);sub_impl(b,a,result);return result;}} else if (a->sign==1 && b->sign==1) { //情況四b->sign=0; a->sign=0;return calc_sub(b,a); //調(diào)換減數(shù)和被減數(shù),變成情況一}else if (a->sign==0 && b->sign==1) { // 情況二b->sign=0;bignumber_s *result = calc_add(a,b);result->sign = 0;return result; } else if (a->sign==1 && b->sign==0) { // 情況三a->sign=0;bignumber_s *result = calc_add(a,b);result->sign = 1;return result; } }// 實(shí)現(xiàn)無(wú)符號(hào)乘法,axb , z為積 void mul_impl(bignumber_s *x, bignumber_s *y, bignumber_s *z) {int n = x->len;int m = y->len;int i = 0;int j = 0;int carry = 0;for (i=0; i<m; i++) {// y的每一位乘以x,即計(jì)算y[i] * x[0...n] 并累加到z[i...i+n]中for (j=0; j<n; j++) {carry += y->data[i]*x->data[j] + z->data[i+j];z->data[i+j] = carry%BASE;carry /= BASE;}// 將剩余的進(jìn)位,繼續(xù)在z[i+n...n+m]中累加,從而完成y[i]乘以x[0...n]其積累加到z[i...m+n]中for (; j+i<n+m; j++) {carry += z->data[i+j];z->data[i+j] = carry % BASE;carry /= BASE;}} }bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {int len = a->len + b->len;bignumber_s *result = make_bignumber_temp(len,a->sign==b->sign?0:1); //a->sign==b->sign為情況一,否則為情況二。mul_impl(a,b,result);return result; }bignumber_s *calc_div(bignumber_s *a, bignumber_s *b) {// 實(shí)現(xiàn)除法return NULL; } int main(int argc, char *argv[]) {bignumber_s *a = make_bignumber_fromstr(argv[1]);bignumber_s *b = make_bignumber_fromstr(argv[3]);if (argc!=4) usage(argv[0]);if (0 == strcmp(argv[2],"+"))print_bignumber(calc_add(a,b));else if (0 == strcmp(argv[2],"-"))print_bignumber(calc_sub(a,b));else if (0 == strcmp(argv[2],"x"))print_bignumber(calc_mul(a,b));else if (0 == strcmp(argv[2],"/"))print_bignumber(calc_div(a,b));else usage(argv[0]);return 0; }

    2.5.4 演示

    編譯命令:

    $ gcc -o calculatorv3 calculatorv3.c

    結(jié)果演示:

    2.6 實(shí)現(xiàn)除法

    2.6.1 除法實(shí)現(xiàn)

    除法的實(shí)現(xiàn),我們直接轉(zhuǎn)化為減法,大致思路如下:

  • 用被除數(shù)減去除數(shù),
  • 差大于等于0時(shí),商的值加1,將差賦值給被除數(shù),重新回到步驟1
  • 差小于0時(shí),整個(gè)除法計(jì)算過(guò)程完畢。
  • 這種實(shí)現(xiàn)方法,在某種情況下效率會(huì)非常低,但是實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。

    有符號(hào)的除法,其處理更乘法是一致的。

    除法實(shí)現(xiàn)代碼如下:

    // 大數(shù)加一操作 void plusone(bignumber_s *a) {int len = a->len ;int i;int carry = 1;for (i=0; i<len; i++) {carry += a->data[i];a->data[i] = carry%BASE;carry /= BASE;} } // 大數(shù)除法實(shí)現(xiàn) bignumber_s *calc_div(bignumber_s *a, bignumber_s *b) {bignumber_s *zero = make_bignumber_temp(1,0);if (cmp(b,zero)==0) {// 除數(shù)為0 報(bào)錯(cuò)fprintf(stderr,"Integer division by zero\n");exit(-1);}else if (cmp(a,zero)==0) { // 被除數(shù)為0 ,結(jié)果為0return zero;}int len = a->len;bignumber_s *result = make_bignumber_temp(len,a->sign==b->sign?0:1);a->sign = 0;b->sign = 0;bignumber_s *temp = make_bignumber_temp(len, 0);bignumber_s *aa = a;while(1) {if (cmp(aa, b)>=0) {sub_impl(aa, b, temp);plusone(result);aa = temp;} else {free(temp);return result;}} }

    2.6.2 大數(shù)計(jì)算器v4版本

    /* * file name : calculatorv4.c * desp : calculator version 4 */ #include <stdio.h> #include <stdlib.h> #include <string.h>#define BASE (10) #define MAX(x,y) ((x)>(y)?(x):(y))// 大數(shù)數(shù)據(jù)結(jié)構(gòu) typedef struct bignumber_s{char sign; // 代表大數(shù)的符號(hào),1為負(fù)數(shù),0為正數(shù)int len; // 代表大數(shù)的位數(shù)char data[]; // 大數(shù)的數(shù)據(jù)內(nèi)容,data[0]代表個(gè)位,data[1]代表十位,data[2]代表百位.... } bignumber_s;bignumber_s *calc_add(bignumber_s *a, bignumber_s *b); bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b);// 構(gòu)造大數(shù)模板,len指向大數(shù)的數(shù)據(jù)位數(shù),sign表示該大數(shù)的符號(hào) bignumber_s *make_bignumber_temp(int len, int sign) {// 分配bignumber_s及其所代表數(shù)據(jù) 所需的內(nèi)存bignumber_s *temp = malloc(sizeof(bignumber_s)+len);if (NULL == temp) {perror("Malloc");exit(-1);}temp->sign = sign;temp->len = len;memset(temp->data, 0, len);return temp; }// 處理數(shù)字字符串冗余的0,即"00123" -> "123" const char *strip_str(const char *str) {int i = 0;int len = strlen(str);for (i=0; i<len-1&&str[i]=='0'; i++) ;return str+i; } // 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中 void fill_data_fromstr(bignumber_s *n, const char *str) {int i = 0;int len = n->len;for (i=0; i<len; i++) {int d = str[len-1-i]-'0';if (d>=0 && d<=9) n->data[i] = d;else {fprintf(stderr, "Invalid Number:%s\n", str);exit(-1);}} } // 從字符串構(gòu)造一個(gè)大數(shù) bignumber_s *make_bignumber_fromstr(const char *str) {// 處理負(fù)數(shù)字符串,即"-123"int sign = 0;if (str[0]=='-') {sign = 1;str++;}// 處理數(shù)字字符串冗余的0,即"00123" -> "123"const char * striped_str = strip_str(str);int len = strlen(striped_str);// 指定數(shù)據(jù)位長(zhǎng)度即符號(hào),創(chuàng)建一個(gè)大數(shù)模板bignumber_s *temp = make_bignumber_temp(len ,sign);// 將字符串?dāng)?shù)據(jù)填充進(jìn)模板中,完成大數(shù)創(chuàng)建fill_data_fromstr(temp, striped_str);return temp; }// 以字符串的形式打印輸出一個(gè)大數(shù) void print_bignumber(bignumber_s* b) {int len = b->len;char *str = malloc(len+1);int i = 0;for (i=0; i<len; i++) {str[i] = b->data[len-i-1]+'0';}str[len] = '\0';fprintf(stdout,"%s%s\n", b->sign==1?"-":"", strip_str(str));free(str); }void usage(const char *s) {fprintf(stderr, "Usage:%s number1 +-x/ number2.\n",s);exit(-1); }// 實(shí)現(xiàn)無(wú)符號(hào)加法,a和b為加數(shù),r為和 void add_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i = 0;char carry = 0;int len = r->len;for (i=0; i<len; i++) {if (i<a->len)carry += a->data[i];if (i<b->len)carry += b->data[i];r->data[i] = carry%BASE;carry /= BASE;} }bignumber_s *calc_add(bignumber_s *a, bignumber_s *b) {// 情況一和情況四if (a->sign==b->sign) {// n位數(shù)+m位數(shù),其和最大為max(n,m)+1位數(shù)int len = MAX(a->len, b->len) + 1;bignumber_s *result = make_bignumber_temp(len,a->sign);add_impl(a,b,result);return result;} else if (a->sign == 0 && b->sign == 1) {//情況二b->sign = 0; //b數(shù)去絕對(duì)值return calc_sub(a,b);} else if (a->sign == 1 && b->sign == 0) {//情況三a->sign = 0; //a數(shù)去絕對(duì)值return calc_sub(b,a);} }// 實(shí)現(xiàn)無(wú)符號(hào)減法,a-b , r為差 void sub_impl(bignumber_s *a, bignumber_s *b, bignumber_s *r) {int i=0;int borrow = 0;int len = r->len;int temp = 0;for (i=0; i<len; i++) {temp = a->data[i]+BASE-borrow-((i<b->len)?b->data[i]:0);r->data[i] = temp%BASE;borrow = temp/BASE?0:1;} }int valid_len(bignumber_s *a) {int len = a->len;int i = len-1;for (i=len-1; i>=0; i--) {if (a->data[i]==0) len--;else break;}return len; } // 判斷兩個(gè)大數(shù)的大小 // a > b 返回1 ,a<b 返回 -1 , a==b 返回0 int cmp(bignumber_s *a, bignumber_s *b) {if (a->sign==0&&b->sign==1) return 1;if (a->sign==1&&b->sign==0) return -1;int sign = a->sign;int alen = valid_len(a);int blen = valid_len(b);if (alen>blen) return (sign==1?-1:1);else if (alen<blen) return (sign==1?1:-1);else {int i = 0;int len = alen;for (i=len-1; i>=0; i--) {if (a->data[i]>b->data[i])return (sign==1?-1:1);else if (a->data[i]<b->data[i]) return (sign==1?1:-1);}return 0;} }bignumber_s *calc_sub(bignumber_s *a, bignumber_s *b) {// 情況一if(a->sign==0 && b->sign==0) {if (cmp(a,b)>=0) { // 被減數(shù)大于等于減數(shù),即差大于等于0時(shí)int len = a->len;bignumber_s *result = make_bignumber_temp(len,0);sub_impl(a,b,result);return result;} else { // 被減數(shù)小于減數(shù),即差小于0時(shí)int len = b->len;bignumber_s *result = make_bignumber_temp(len,1);sub_impl(b,a,result);return result;}} else if (a->sign==1 && b->sign==1) { //情況四b->sign=0; a->sign=0;return calc_sub(b,a); //調(diào)換減數(shù)和被減數(shù),變成情況一}else if (a->sign==0 && b->sign==1) { // 情況二b->sign=0;bignumber_s *result = calc_add(a,b);result->sign = 0;return result; } else if (a->sign==1 && b->sign==0) { // 情況三a->sign=0;bignumber_s *result = calc_add(a,b);result->sign = 1;return result; } }// 實(shí)現(xiàn)無(wú)符號(hào)乘法,x * y , z為積 void mul_impl(bignumber_s *x, bignumber_s *y, bignumber_s *z) {int n = x->len;int m = y->len;int i = 0;int j = 0;int carry = 0;for (i=0; i<m; i++) {// y的每一位乘以x,即計(jì)算y[i] * x[0...n] 并累加到z[i...i+n]中for (j=0; j<n; j++) {carry += y->data[i]*x->data[j] + z->data[i+j];z->data[i+j] = carry%BASE;carry /= BASE;}// 將剩余的進(jìn)位,繼續(xù)在z[i+n...n+m]中累加,從而完成y[i]乘以x[0...n]其積累加到z[i...m+n]中for (; j+i<n+m; j++) {carry += z->data[i+j];z->data[i+j] = carry % BASE;carry /= BASE;}} }bignumber_s *calc_mul(bignumber_s *a, bignumber_s *b) {int len = a->len + b->len;bignumber_s *result = make_bignumber_temp(len,a->sign==b->sign?0:1); //a->sign==b->sign為情況一,否則為情況二。mul_impl(a,b,result);return result; }// 大數(shù)加一操作 void plusone(bignumber_s *a) {int len = a->len ;int i;int carry = 1;for (i=0; i<len; i++) {carry += a->data[i];a->data[i] = carry%BASE;carry /= BASE;} } // 大數(shù)除法實(shí)現(xiàn) bignumber_s *calc_div(bignumber_s *a, bignumber_s *b) {bignumber_s *zero = make_bignumber_temp(1,0);if (cmp(b,zero)==0) {// 除數(shù)為0 報(bào)錯(cuò)fprintf(stderr,"Integer division by zero\n");exit(-1);}else if (cmp(a,zero)==0) { // 被除數(shù)為0 ,結(jié)果為0return zero;}int len = a->len;bignumber_s *result = make_bignumber_temp(len,a->sign==b->sign?0:1);a->sign = 0;b->sign = 0;bignumber_s *temp = make_bignumber_temp(len, 0);bignumber_s *aa = a;while(1) {if (cmp(aa, b)>=0) {sub_impl(aa, b, temp);plusone(result);aa = temp;} else {free(temp);return result;}} }int main(int argc, char *argv[]) {bignumber_s *a = make_bignumber_fromstr(argv[1]);bignumber_s *b = make_bignumber_fromstr(argv[3]);if (argc!=4) usage(argv[0]);if (0 == strcmp(argv[2],"+"))print_bignumber(calc_add(a,b));else if (0 == strcmp(argv[2],"-"))print_bignumber(calc_sub(a,b));else if (0 == strcmp(argv[2],"x"))print_bignumber(calc_mul(a,b));else if (0 == strcmp(argv[2],"/"))print_bignumber(calc_div(a,b));else usage(argv[0]);return 0; }

    2.6.3 演示

    編譯命令:

    $ gcc -o calculatorv4 calculatorv4.c

    結(jié)果演示:

    大數(shù)計(jì)算器在解決除法問(wèn)題的時(shí)候僅實(shí)現(xiàn)了商的求解,并未對(duì)余數(shù)進(jìn)行過(guò)多的處理,其實(shí)這是不完善的。大家可以在此基礎(chǔ)上,思考思考如何改進(jìn)能夠讓計(jì)算器更加完善。

    三、實(shí)驗(yàn)總結(jié)

    本實(shí)驗(yàn)通過(guò)完成一個(gè)大數(shù)計(jì)算器的玩具程序,一方面有助于理解計(jì)算機(jī)數(shù)學(xué)運(yùn)算的實(shí)現(xiàn)機(jī)理,另一方面有助于提升c語(yǔ)言的編程能力。 當(dāng)然我們的大數(shù)計(jì)算器,在除法方面的性能還是不太令人滿意的,希望有興趣的讀者朋友,后續(xù)能夠?qū)τ?jì)算器實(shí)現(xiàn)進(jìn)行改進(jìn)。

    四、參考鏈接

    • C語(yǔ)言接口與實(shí)現(xiàn)

    總結(jié)

    以上是生活随笔為你收集整理的C语言实现大数计算器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产真实精品久久二三区 | 91尤物在线播放 | 国产精品色视频 | 久操视频在线免费看 | 摸bbb搡bbb搡bbbb | av资源免费在线观看 | 免费精品人在线二线三线 | 久久精品欧美一区二区三区麻豆 | 国产午夜精品一区二区三区在线观看 | 俺要去色综合狠狠 | 天天干天天天天 | 丁香激情综合久久伊人久久 | 国内精品在线一区 | 久草电影在线观看 | 亚洲国内精品视频 | a天堂免费 | 成人免费在线视频观看 | 国产精品一区免费在线观看 | 久久久99精品免费观看乱色 | 精品国产一区二区三区av性色 | 天天综合网 天天 | 午夜精品久久久久久久久久久久久久 | 亚洲另类在线视频 | 国产中文字幕第一页 | 在线免费观看成人 | 五月开心六月伊人色婷婷 | 国产精品毛片一区视频播 | 国产精品99爱 | 一级一级一片免费 | 国内精品福利视频 | 日本三级国产 | 精品亚洲国产视频 | 日韩激情在线 | 中文字幕国语官网在线视频 | 久久免费精品 | 国产盗摄精品一区二区 | 国产中文字幕视频在线观看 | 国产一区二区三区 在线 | 天天干天天做 | 深夜国产在线 | 黄色免费观看视频 | free,性欧美| 天天色天天骑天天射 | 天天干,天天射,天天操,天天摸 | 国产精品白丝jk白祙 | 亚洲免费国产视频 | 国产剧在线观看片 | av免费看网站 | 精品a在线| 久久视频精品在线观看 | 国产99久久久国产精品成人免费 | 一区二区三区四区不卡 | 欧美精品久 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 日韩中文字 | 国产精品久久久久免费 | 色综合天天综合 | 四虎免费av| 日韩精品一区二区在线观看视频 | 久草在线手机视频 | 99视频在线| 国产精品久久久久久久婷婷 | 午夜少妇 | 91成人免费在线视频 | 欧美一区二区三区在线 | 在线视频 91| 欧美a级在线免费观看 | 日韩精品免费在线视频 | 久久久精品国产免费观看一区二区 | 中文字幕一区二区三区在线播放 | 青青河边草免费直播 | av中文字幕网址 | 天堂入口网站 | 国偷自产中文字幕亚洲手机在线 | 97色婷婷 | 色综合激情久久 | 免费高清男女打扑克视频 | 91日韩在线视频 | 国产黄色精品在线 | 99免费在线视频 | 成人在线免费视频 | 成人午夜影视 | 亚洲日日夜夜 | 青青河边草观看完整版高清 | 99久久精品免费看国产 | 久久伊人综合 | 在线观看国产区 | 成人免费视频免费观看 | 中文字幕免费一区二区 | 亚洲精品成人网 | 福利网址在线观看 | 亚洲少妇自拍 | 69国产在线观看 | 精品在线观看一区二区 | 五月婷婷影院 | 91高清视频免费 | 国产一级片在线播放 | 欧美一区二区精品在线 | 成人免费视频播放 | 亚洲精品乱码久久 | 91亚洲国产成人 | 国产麻豆精品久久一二三 | 高清色免费 | 三级黄色片在线观看 | 99热 精品在线 | 一区二区三区三区在线 | 黄色在线视频网址 | 中文字幕人成乱码在线观看 | 日韩欧美在线综合网 | 国产一区二区精品 | 欧美日韩伦理一区 | 又粗又长又大又爽又黄少妇毛片 | 日韩av专区 | 2023年中文无字幕文字 | 日日夜夜操操操操 | 国产特黄色片 | 婷婷色在线观看 | 国产成人精品免费在线观看 | 九9热这里真品2 | 欧美在线视频精品 | 久久国内精品99久久6app | 成人网444ppp| 激情久久久久久久久久久久久久久久 | 日韩免费观看一区二区 | 青青草国产免费 | 久久精品国产免费观看 | 成人免费视频网 | av东方在线 | 99热手机在线观看 | 天天操天天操天天操 | 欧美一级性生活 | 久草国产精品 | 国产小视频在线观看 | av片子在线观看 | 色在线视频 | 日日夜夜精品网站 | 日本精品中文字幕 | 国产资源在线免费观看 | 99国产精品免费网站 | 中日韩在线视频 | 综合网久久| 在线观看视频一区二区三区 | 九九影视理伦片 | 99视屏 | 成人黄色在线电影 | 免费一级黄色 | 国产成人在线播放 | 久久久久亚洲天堂 | 久久毛片网站 | 在线观看国产www | 精品亚洲va在线va天堂资源站 | 一区二区三区免费在线观看 | 免费色网| 成人国产一区 | 久久成 | 天天视频亚洲 | 久久久久在线视频 | 亚洲国产偷 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产伦理一区二区三区 | 人人要人人澡人人爽人人dvd | 美女网色 | 久久久www成人免费毛片麻豆 | 亚洲精品美女在线观看 | 欧美福利网站 | 三级视频片 | 在线看片一区 | 天天曰视频| 日韩一区在线免费观看 | 国产一级淫片在线观看 | 亚洲中字幕 | 国产午夜精品一区二区三区欧美 | 91精品久久久久久久久久入口 | 精品国产一区二区三区男人吃奶 | 五月婷婷网站 | 久久婷婷综合激情 | 国产 在线观看 | 在线观看不卡视频 | 午夜三级福利 | 97超碰在线资源 | 国产成人久久精品 | 探花国产在线 | 久久成人午夜视频 | 在线免费黄网站 | 九色91av| 在线综合 亚洲 欧美在线视频 | 国产色啪| 天天干夜夜想 | 欧美国产日韩激情 | 国产黄在线| 亚洲日本va午夜在线电影 | 国产精品第一 | 欧洲亚洲国产视频 | 成人一级视频在线观看 | 日韩精品在线播放 | 91久久国产精品 | 97精品久久人人爽人人爽 | 国内精品久久久久久久 | 成人av电影在线观看 | 久久激情视频网 | 全久久久久久久久久久电影 | 91视频亚洲 | 久久久香蕉视频 | 久久视频国产精品免费视频在线 | 在线 高清 中文字幕 | 伊人超碰在线 | 欧美日韩在线观看不卡 | 国产精品久久久久一区 | 国产精品九九久久99视频 | 久久香蕉国产 | 日韩av专区 | 成人网444ppp | 午夜精品久久一牛影视 | 亚洲一级国产 | 六月色丁 | 六月激情 | 日韩在线精品一区 | 亚洲资源 | 日本精品久久久久 | 91最新在线| 人人澡超碰碰97碰碰碰软件 | av在线免费网| 欧美大片在线观看一区 | 黄色av电影 | 成 人 免费 黄 色 视频 | 黄色网址a | 97视频在线免费 | 亚洲精品在线观看不卡 | 深爱婷婷激情 | 日本特黄特色aaa大片免费 | 成人h在线播放 | 五月天中文在线 | 四虎在线免费观看 | 午夜精品一区二区三区免费 | 国产手机视频在线播放 | 91av在| 成人av影院在线观看 | 久久福利在线 | 国产精品久久av | 亚洲精品国产第一综合99久久 | 欧美一区二区在线刺激视频 | 999国内精品永久免费视频 | 中文在线a∨在线 | 四虎精品成人免费网站 | 国产精品久久久久久久久久久不卡 | 国产一二三区在线观看 | 香蕉视频免费在线播放 | 免费黄色av | 久草视频播放 | 精品久久久久久久久久 | 97视频精品| 99精品久久99久久久久 | 一区二区三区在线影院 | 高清不卡一区二区在线 | 亚洲成人黄色在线 | 一级免费黄色 | 成年人免费看 | 特级西西444www高清大视频 | 国产精品久久久久久久久久东京 | 四虎影视精品 | 九九免费观看视频 | 91看片麻豆 | 亚洲 欧美 变态 国产 另类 | 免费在线观看av网站 | 久久夜夜爽 | 激情欧美日韩一区二区 | 日日日日干 | 中文字幕黄色 | 久久精品国产第一区二区三区 | 精品视频免费播放 | av在线播放一区二区三区 | 特级毛片网 | 久久婷婷综合激情 | 500部大龄熟乱视频使用方法 | 日韩精品免费在线观看 | 国内精自线一二区永久 | 久久公开视频 | 久久精品网址 | 日韩视频免费在线 | 国产97色| 色综合久久久久综合体桃花网 | 天天操天天操一操 | 国产日产精品一区二区三区四区的观看方式 | 午夜精品久久久久久久久久久 | 免费看一级特黄a大片 | 丁香六月伊人 | 成人av教育| 超碰在线公开 | 91在线看黄| 久草在线视频国产 | 久久久久在线视频 | 免费视频在线观看网站 | www天天干 | 欧美精品免费一区二区 | 天天操比 | 欧美性生活大片 | 久久99久久精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 2023国产精品自产拍在线观看 | 色夜影院 | 91av视频免费观看 | 国产 中文 日韩 欧美 | 欧美一区二区三区激情视频 | 久精品在线观看 | 久久久官网| 午夜国产福利在线观看 | 日韩在线观看视频免费 | 欧美一级免费 | 国产香蕉在线 | 最新av在线播放 | 久久99影院 | 国产一区免费在线 | 成人免费视频网站在线观看 | 在线天堂8√| 丁香六月激情婷婷 | 国产高清永久免费 | 91精品黄色 | 精品一区欧美 | 久久精品女人毛片国产 | 亚洲爽爽网 | 在线视频亚洲 | 国产精品高清在线观看 | 丁香六月色 | 欧美国产一区在线 | 天天色欧美 | 91成人精品一区在线播放69 | 国产精品久久久久久久久大全 | av在线免费网站 | 久久97精品 | 欧洲av不卡 | 91在线www | 日韩中文字幕第一页 | 日日夜夜爱 | 久久国产精品久久精品 | 最新成人av | 456免费视频| av久久久| 999国产精品视频 | 高清在线一区二区 | 不卡日韩av| 久草视频免费看 | 日韩欧美在线高清 | 国产美腿白丝袜足在线av | 久久综合狠狠综合久久狠狠色综合 | 在线欧美小视频 | 黄p网站在线观看 | 中文av影院 | 精品国产大片 | 99视频这里只有 | 亚洲一区二区三区miaa149 | 久久久久福利视频 | 一区二区在线影院 | 天天碰天天操视频 | 国产一区二区在线影院 | 韩国三级av在线 | 国产亚洲va综合人人澡精品 | 国产成人精品电影久久久 | 网址你懂的在线观看 | 日韩三区在线观看 | 精品一区二区免费在线观看 | 午夜精品视频福利 | 91精品视频免费看 | 91av免费在线观看 | 国产精品9999久久久久仙踪林 | 国产精品久久久久久久久久久久午夜片 | 午夜久久久久久久久久影院 | 婷婷av网站 | 久久99热国产 | 日日爽日日操 | 精品播放| 国产福利一区二区三区视频 | 三级黄色免费片 | 国产精品久久久久久麻豆一区 | 欧美精彩视频 | 日韩三级av | 久久久久99精品成人片三人毛片 | 中文一区在线观看 | 在线视频91 | 国产高清在线a视频大全 | 免费看的av片 | 一区二区精品在线视频 | 日韩有码中文字幕在线 | 一区二区三区免费看 | 中日韩三级视频 | 国产精品手机视频 | 韩国在线一区 | 欧美91精品| 婷婷丁香久久五月婷婷 | 在线导航福利 | 五月婷婷狠狠 | 国内成人精品2018免费看 | 又黄又爽又湿又无遮挡的在线视频 | 亚洲精品麻豆 | 99热这里只有精品免费 | 亚洲精品美女视频 | 亚洲涩涩色 | 一性一交视频 | 日本精品一区二区三区在线播放视频 | 一级片观看 | 99热国产精品 | 很黄很污的视频网站 | 天天色天天操综合网 | 偷拍视频一区 | 992tv成人免费看片 | 天天拍天天干 | 日韩在线观看视频免费 | 欧美一级片免费在线观看 | 国产精品美女久久久久久2018 | 97超碰人人澡人人爱学生 | 国产精品久免费的黄网站 | 国产这里只有精品 | 日日夜夜天天操 | 国产精品美女免费视频 | 成人久久国产 | 久久视精品| 激情欧美一区二区免费视频 | 久草视频免费观 | 九九免费在线观看视频 | 探花在线观看 | 亚洲国产精品久久久 | 九九久久久久99精品 | 99久久婷婷国产 | 久草久热 | 精品电影一区 | 97超碰在线免费观看 | 97精品在线观看 | 91av色| 丁香婷婷久久久综合精品国产 | www.91国产 | 亚洲免费公开视频 | 99精彩视频在线观看免费 | 国产精品一区二区中文字幕 | 在线免费亚洲 | 99久久综合国产精品二区 | 不卡的av在线播放 | 成人综合免费 | 国产午夜一级毛片 | www麻豆视频| 中文字幕制服丝袜av久久 | 婷婷色视频 | 97在线视频免费 | 九九热精品国产 | 国产精品av电影 | 日韩免费三级 | 久草在线免费播放 | 精品国产三级 | 一区二区精品 | 一区二区视频在线看 | 91亚洲精| 在线亚洲日本 | 成人不用播放器 | 久久艹艹| 国产精久久 | 国产精品欧美日韩在线观看 | 欧美一区二区三区特黄 | 亚洲做受高潮欧美裸体 | 最近中文字幕完整高清 | 国产精品黄色在线观看 | va视频在线观看 | 在线高清一区 | 欧美美女一级片 | 欧美一级网站 | 欧美成人一二区 | 欧美一级日韩免费不卡 | 五月天电影免费在线观看一区 | 在线观看视频国产 | 国产又黄又爽又猛视频日本 | 亚洲va天堂va欧美ⅴa在线 | 黄色成人av在线 | 国产精品人人做人人爽人人添 | www.久久99| 国产欧美精品一区二区三区 | 婷婷综合 | 久久99精品热在线观看 | 久久亚洲免费 | 国产视频首页 | 国内小视频 | 99精品国产在热久久 | 伊人天堂网 | www.黄色网.com | 99久久超碰中文字幕伊人 | 精品视频在线看 | 人成在线免费视频 | 国产精品乱码高清在线看 | 国产视频2021 | 国产电影一区二区三区四区 | 色婷婷一区 | 亚洲一二视频 | 成人av在线电影 | 一区二区三区电影 | 99re8这里有精品热视频免费 | 亚洲国产精品影院 | 五月开心婷婷网 | www.国产在线视频 | 国产成人av在线 | 午夜色场| 亚洲男模gay裸体gay | 国产精品国产三级国产不产一地 | 免费看短 | 午夜精品影院 | 中文字幕av在线电影 | 免费看的黄色的网站 | 91久久国产露脸精品国产闺蜜 | 天天草网站 | 国产亚洲高清视频 | 国产涩图 | 国产97色在线 | 91在线永久| 亚洲精品在线观看不卡 | 婷婷六月丁| 久久综合偷偷噜噜噜色 | 中文字幕日本特黄aa毛片 | 又色又爽又黄 | 区一区二区三区中文字幕 | 激情综合啪啪 | 国产99久久久精品 | 最近高清中文字幕 | 在线中文字幕视频 | 高清不卡一区二区三区 | 久久午夜免费视频 | 色哟哟国产精品 | 久久五月婷婷丁香社区 | 狠狠综合网 | 国产精品福利无圣光在线一区 | 在线观看中文字幕av | 免费看片网址 | av高清一区二区三区 | 在线观看国产永久免费视频 | 亚洲丁香久久久 | 日韩av片在线| 黄色大全免费观看 | www.91国产 | 亚洲精品观看 | 日韩激情免费视频 | 午夜影院在线观看18 | 国产午夜精品一区二区三区嫩草 | 国产精品久久久久毛片大屁完整版 | 91视频久久久久 | 2022国产精品视频 | 成年人视频在线免费观看 | 国产黄色精品视频 | 狠狠色狠狠色综合日日小说 | 成人在线免费av | 日韩午夜在线观看 | 岛国片在线 | 色诱亚洲精品久久久久久 | 久草在线免费资源 | 丁香婷婷综合激情 | 欧美日韩国产一区二 | www.夜夜 | 国产91探花 | 日本成人免费在线观看 | www.亚洲视频.com| 亚洲一区久久 | 最近中文字幕视频网 | 国产日本在线观看 | 天天插天天射 | 日韩一级成人av | 国产91粉嫩白浆在线观看 | 精品在线观看一区二区三区 | 成人毛片一区二区三区 | 五月婷婷丁香 | 色天天久久 | 日本99精品 | 大胆欧美gogo免费视频一二区 | 2018好看的中文在线观看 | 成 人 黄 色 视频免费播放 | av电影免费在线看 | 69久久99精品久久久久婷婷 | 91在线看黄 | 国产精品久久久久久久久大全 | free,性欧美 九九交易行官网 | 麻豆va一区二区三区久久浪 | 99视频免费观看 | 午夜视频一区二区 | 国产精品国产三级国产aⅴ9色 | 久久久网站| 日韩1级片 | 又黄又刺激的视频 | 视色网站 | 97精品在线| 久草在线视频首页 | 人人爽人人爽人人爽 | 精品九九九九 | 超碰在线公开 | 91av短视频 | 国产一区二区在线观看免费 | 91成人在线观看高潮 | 日韩久久午夜一级啪啪 | 国产99久久久精品 | 色综合久久五月天 | 狠狠插狠狠干 | 波多野结衣一区二区三区中文字幕 | 美女视频黄色免费 | 婷婷开心久久网 | 国产午夜在线观看视频 | 最新日韩电影 | 久久精品一区二区三 | 亚洲理论在线观看电影 | 天天操天天操天天操天天操天天操 | 国产精品伦一区二区三区视频 | 欧美极品一区二区三区 | 亚洲码国产日韩欧美高潮在线播放 | 国产福利av | 在线观看免费视频你懂的 | 国产99久久 | 天天干天天拍天天操 | 黄色国产高清 | 国产a国产 | 四虎成人精品 | 中国老女人日b | 国产综合香蕉五月婷在线 | 日韩黄色影院 | 久久精品一区二区三区四区 | 久久国产美女 | 国产尤物在线观看 | 欧美乱码精品一区二区 | zzijzzij亚洲成熟少妇 | 国产精品尤物 | 99久久精品无免国产免费 | 草久在线观看 | 在线视频观看亚洲 | 亚洲精品国产成人 | 天天干,天天射,天天操,天天摸 | 91成人看片 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 午夜精品久久久久久久久久久久久久 | 久久综合中文字幕 | 精品国产自在精品国产精野外直播 | 国产在线理论片 | 天天爱天天草 | 综合国产在线 | 黄色资源在线观看 | 午夜av网站 | 中文字幕视频播放 | 高清在线观看av | 国产色视频一区二区三区qq号 | 成片免费观看视频 | 手机看片福利 | 天天曰天天曰 | 免费视频二区 | 日韩一二区在线 | 99精品国产一区二区 | 日日日日日 | 国模精品在线 | 欧美成人播放 | 久久久资源 | 97**国产露脸精品国产 | 天天操天天操天天 | 日韩xxxx视频 | av电影免费在线看 | 这里只有精品视频在线 | 美女视频一区 | 免费高清在线观看电视网站 | 欧美精品中文 | 色伊人网| 欧美作爱视频 | 人人澡人人舔 | 人人爱天天操 | 亚洲精品色 | 手机看片午夜 | 中国黄色一级大片 | 中文字幕精品www乱入免费视频 | 日韩激情小视频 | 国产色区| 中文字幕国产精品一区二区 | 伊人久久婷婷 | 视频在线99re | 成人va在线观看 | 日韩精品电影在线播放 | 国产三级午夜理伦三级 | 久久综合免费视频影院 | 久久视频在线看 | 欧美激情综合五月色丁香 | 国产精品久久久久aaaa九色 | 黄色网址在线播放 | 午夜12点 | 亚洲国产精品久久久 | 国产精品av在线 | 国产精品成久久久久 | 福利一区二区 | 欧美怡红院| 国内精品久久久久久久影视简单 | 亚洲成a人片在线www | 911久久| 欧美色图东方 | 久久这里精品视频 | 玖玖综合网 | 亚洲精品在线观看网站 | 麻豆视频入口 | 欧美91成人网 | 日日夜夜精品视频天天综合网 | 亚洲一级理论片 | 一区二区三区四区五区六区 | 天天操天天干天天操天天干 | 国产精品99久久久久久久久 | 在线中文字幕一区二区 | 黄色精品国产 | 美女很黄免费网站 | 青青草国产免费 | 亚洲在线观看av | 四虎成人精品在永久免费 | 亚洲第一区在线播放 | 人人舔人人爱 | 午夜久久福利影院 | 2024av| 91av视频在线免费观看 | 天堂网中文在线 | 天天干夜夜操视频 | 亚洲精品自在在线观看 | 国产精品手机视频 | 色婷婷综合在线 | 成人天堂网 | 成人在线电影观看 | 热久久免费国产视频 | 99热精品在线观看 | 日本久久电影网 | av在线com| 麻豆影视网站 | 九九久久久久久久久激情 | 久久久高清免费视频 | 国产小视频免费在线观看 | 国产一级a毛片视频爆浆 | 69精品视频在线观看 | 国产高清专区 | 国产精品久久久久久久久久新婚 | www.xxxx变态.com | 激情久久一区二区三区 | 最近能播放的中文字幕 | 国产精品成人一区二区三区吃奶 | 日韩一二区在线观看 | 在线观看视频99 | 97视频免费看 | www.久久色 | av在线在线 | 国产黄色看片 | 成年人黄色免费看 | 在线观看成人网 | 欧美日韩国产在线一区 | 久久精品香蕉视频 | 国产91学生粉嫩喷水 | 国产高清中文字幕 | 日韩午夜电影 | 日韩av高清在线观看 | 精品欧美日韩 | 国产一线在线 | 成人av久久 | 91亚洲精品国偷拍 | 免费福利影院 | 99久久精品国产一区二区成人 | 五月天久久精品 | 亚洲成人免费观看 | 青草视频网 | 国产精品av电影 | 久久国产免费 | 五月婷婷狠狠 | 成人av免费电影 | 日韩在线大片 | 国产精品黄色 | 久久亚洲福利视频 | 国产精品涩涩屋www在线观看 | a级国产片| 亚洲黄色小说网址 | 日韩三级.com| 久久69精品久久久久久久电影好 | 日韩在线视频网站 | 亚洲精品av中文字幕在线在线 | 中文字幕专区高清在线观看 | 久久久久免费精品视频 | 国产精品一区二区在线免费观看 | www.eeuss影院av撸 | 亚洲精品综合一二三区在线观看 | 精品uu| 欧美成人aa | 国产精品一区二区在线播放 | 色av男人的天堂免费在线 | 国内视频1区 | 不卡的一区二区三区 | 亚洲1级片 | 精品国产91亚洲一区二区三区www | 色综合久久综合网 | 成人黄色影片在线 | 麻豆传媒电影在线观看 | 久草在线电影网 | 久草精品视频在线观看 | 碰天天操天天 | 日韩精品极品视频 | 国产精品一区二区免费视频 | 久热精品国产 | 人人天天夜夜 | 黄色视屏免费在线观看 | 色老板在线 | av在线a | 欧日韩在线 | 国产亚洲在线视频 | 中文字幕高清有码 | 蜜臀aⅴ国产精品久久久国产 | 亚洲日本在线视频观看 | 欧美专区亚洲专区 | 精品国产一区二区三区男人吃奶 | 亚洲色图色 | 美女免费视频一区二区 | 久久综合九色 | 日韩欧美一区二区三区免费观看 | 久久影视网 | 五月天伊人 | 欧美a级片网站 | 综合黄色网 | 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲精品久久久久www | 天天射综合网视频 | 久久亚洲欧美 | 一区二区欧美在线观看 | 欧美最新另类人妖 | 欧美久久久久 | 亚洲成人精品在线 | 99热在线精品观看 | 国产精品免费小视频 | 欧美日韩免费观看一区=区三区 | 在线观看免费av片 | 国产免费视频一区二区裸体 | 日韩两性视频 | 97视频网站 | 中文字幕在线观看播放 | 国产精品精 | 日韩精品资源 | 色在线亚洲 | 国产破处在线播放 | 日韩欧美在线观看一区 | 一级黄色片在线观看 | 人人澡人人舔 | 欧美网站黄色 | 在线观看免费91 | 免费视频一级片 | 久久亚洲热 | 91丨精品丨蝌蚪丨白丝jk | 久久精品亚洲精品国产欧美 | 99爱在线 | 四虎成人精品在永久免费 | 黄色影院在线免费观看 | 天天爱天天草 | 4438全国亚洲精品在线观看视频 | 天天性天天草 | 99热这里有 | 精品一区二区三区久久久 | 国产精品永久在线观看 | 国产97色| 国产精品第一页在线 | 正在播放亚洲精品 | 99久久99久久精品免费 | 五月婷婷综合网 | 91久久国产自产拍夜夜嗨 | 久久久午夜精品理论片中文字幕 | 亚洲欧美视频在线播放 | 色婷婷精品| 欧美亚洲专区 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 亚欧日韩av| 欧美在线视频二区 | 日本在线观看一区二区三区 | 亚洲欧美日韩在线一区二区 | 久久激情综合网 | 亚洲欧洲精品一区二区精品久久久 | 97人人澡人人添人人爽超碰 | 狠狠干婷婷色 | 激情文学综合丁香 | 99国产高清| 97网站| 精品久久久久久久久久久久久久久久 | 欧美性视频网站 | 四虎成人在线 | 久久成人免费视频 | 欧美精品小视频 | 亚洲精品国精品久久99热一 | 久久精品网| 嫩草av影院 | 激情五月婷婷网 | 国产精品ⅴa有声小说 | 中文在线a∨在线 | 成人毛片一区 | 欧洲色吧 | 免费国产在线精品 | 中文字幕免费播放 | 正在播放 国产精品 | 丁香视频五月 | 国产精品破处视频 | 中文字幕资源在线观看 | 色网站免费在线观看 | 久操久| 久久蜜臀一区二区三区av | 丁香视频免费观看 | 国产成人精品久久久久 | 欧美激情在线网站 | 岛国av在线免费 | 99热国产在线观看 | av黄在线播放 | 成人黄色av免费在线观看 | 2019中文| 欧美一区二区三区在线观看 | 99精品欧美一区二区 | 国产成人精品999 | 高清av中文在线字幕观看1 | 一区二区三区四区精品视频 | 成人在线免费观看网站 | 狠狠躁日日躁夜夜躁av | 免费看黄色毛片 | 成人久久18免费网站麻豆 | 精品国产自在精品国产精野外直播 | 日韩电影一区二区在线 | 手机色在线 | 久久深爱网 | 99热这里只有精品1 av中文字幕日韩 | 黄色的网站在线 | 在线视频欧美日韩 | 日韩电影中文字幕在线 | 99久久激情 | 日韩欧美xx| 天天色综合天天 | 日韩高清免费电影 | 欧美了一区在线观看 | 久久免费福利 | 91福利视频免费 | 亚洲精品视频网站在线观看 | 免费在线观看日韩视频 | 日韩精品中文字幕在线 | 99综合电影在线视频 | 91看片在线观看 | 亚洲女裸体 | 九九精品视频在线观看 | 最近更新中文字幕 | 欧美成年网站 | 日韩电影在线一区二区 | 在线观看中文字幕第一页 | 国产精品永久免费在线 | 黄色小说免费观看 | 色婷婷久久久综合中文字幕 | 久久久免费看片 | 三级黄在线 | 国产精品一区二区白浆 | 免费色视频网站 | 免费在线观看a v | 久久成电影 | 色综合天 | 亚洲一级片免费观看 | 欧美一区二区三区在线播放 | 婷婷免费视频 | 中文字幕网站视频在线 | 久久国产欧美日韩精品 | 婷婷丁香色 | 五月婷婷狠狠 | 天天色天天干天天色 | 人人爽人人爽人人爽人人爽 | 亚洲成人免费观看 | 天天综合网久久综合网 | 懂色av一区二区三区蜜臀 | 婷婷色中文 | 丰满少妇在线观看网站 | 日本护士三级少妇三级999 | 男女激情片在线观看 | 五月婷婷丁香激情 | 久久激情久久 | 成人黄色毛片 | 视频一区二区免费 | 久久视频在线 | 中文字幕视频一区 | 国内精品福利视频 | 天天干,夜夜爽 | 久久国内视频 | 996久久国产精品线观看 | 91在线视频在线 | 四虎影视成人精品 | 日韩在线视频观看免费 | 久福利 | 91亚洲精品久久久蜜桃网站 | www.超碰97.com | 婷婷在线色 | 亚洲人人av| 国产亚州av | 在线看片视频 | 丁香婷婷综合五月 | 狠狠干激情 | 亚洲女在线 | 麻豆视频在线免费 | 中文字幕在线看人 | 日本久久免费视频 | 又湿又紧又大又爽a视频国产 | a色视频 | 日日干天夜夜 | 久久久免费少妇 | av电影在线观看完整版一区二区 | 欧美日韩在线观看一区 | 波多野结衣在线观看视频 | 亚洲一级影院 | 成人羞羞视频在线观看免费 | 亚洲欧美视频 | 蜜臀av一区二区 | 黄污网| 在线观看一区视频 |