高精度加、減、乘法運算

來源:互聯網
上載者:User

#include <stdio.h><br />#include <string.h><br />#define DIGIT 2 //num length of a array unit<br />#define MAXDIGIT 100 //10^DIGIT, max-1 of a array unit<br />#define MAX 1000 //Max of array<br />#define LL long //type of num </p><p>struct BigInt<br />{<br /> LL data[MAX];<br /> int size;<br />}; </p><p>//把string類型轉換為BigInt類型<br />BigInt StrToBigInt(char *str)<br />{<br /> int i,j,k;<br /> LL sum;<br /> BigInt ret;<br /> memset(&ret, 0, sizeof(ret));<br /> int len;<br /> len = strlen(str);<br /> i=0;k=0;<br /> while (len-i>=DIGIT)<br /> {<br /> sum = 0;<br /> for (j=len-i-DIGIT;j<len-i;j++)<br /> sum = sum*10+(str[j]-'0');<br /> ret.data[k++] = sum;<br /> i+=DIGIT;<br /> }<br /> if (i<len)<br /> {<br /> sum = 0;<br /> for (j=0;j<len-i;j++)<br /> sum = sum*10+(str[j]-'0');<br /> ret.data[k++] = sum;<br /> }<br /> ret.size = k;<br /> return ret;<br />} </p><p>BigInt BigIntMul(BigInt a, BigInt b)<br />{<br /> BigInt ret;<br /> memset(&ret, 0, sizeof(ret));<br /> if (a.size == 1&&a.data[0] == 0)<br /> { ret.data[0] = 0;ret.size = 1;return ret; }<br /> if (b.size == 1&&b.data[0] == 0)<br /> { ret.data[0] = 0;ret.size = 1;return ret; } </p><p> int i,j;<br /> for (i=0;i<a.size;i++)<br /> {<br /> for (j=0;j<b.size;j++)<br /> {<br /> ret.data[i+j] += b.data[j] * a.data[i];<br /> ret.data[i+j+1] += ret.data[i+j] / MAXDIGIT;<br /> ret.data[i+j] = ret.data[i+j] % MAXDIGIT;<br /> }<br /> }<br /> ret.size = i+j;<br /> if (ret.data[ret.size]!=0)<br /> ret.size++;<br /> while(ret.data[ret.size-1]==0&&ret.size!=1)<br /> ret.size--;<br /> return ret;<br />} </p><p>BigInt BigIntSum(BigInt a, BigInt b)<br />{<br /> BigInt ret;<br /> int i;<br /> int max;<br /> memset(&ret, 0, sizeof(ret));<br /> a.size>b.size?max=a.size:max=b.size;<br /> for (i=0;i<max;i++)<br /> {<br /> ret.data[i] += a.data[i]+b.data[i];<br /> ret.data[i+1] += ret.data[i] / MAXDIGIT;<br /> ret.data[i] %= MAXDIGIT;<br /> }<br /> ret.size = i;<br /> if (ret.data[ret.size]!=0)<br /> ret.size++;<br /> while(ret.data[ret.size-1]==0&&ret.size!=1)<br /> ret.size--;<br /> return ret;<br />}<br />//1:a>b -1:a<b 0:equal<br />int CompareBigInt(BigInt a, BigInt b)<br />{<br /> if (a.size>b.size)<br /> return 1;<br /> if (a.size<b.size)<br /> return -1;<br /> int i;<br /> for (i=a.size-1;i>=0;i++)<br /> {<br /> if (a.data[i]>b.data[i])<br /> return 1;<br /> if (a.data[i]<b.data[i])<br /> return -1;<br /> }<br /> return 0;<br />} </p><p>void PrintBigInt(BigInt a)<br />{<br /> int i;<br /> if (a.size == 0)<br /> { printf("0/n");return; }<br /> if (a.data[a.size-1]!=0||a.size==1)<br /> printf("%d",a.data[a.size-1]);<br /> for (i=a.size-2;i>=0;i--)<br /> {<br /> int w = MAXDIGIT / 10;<br /> while (w > 1)<br /> {<br /> if (a.data[i] >= w)<br /> break;<br /> printf("0");<br /> w /= 10;<br /> }<br /> printf("%d",a.data[i]);<br /> }<br /> printf("/n");<br />} </p><p>BigInt BigIntSub(BigInt a, BigInt b)<br />{<br /> BigInt ret;<br /> BigInt SubNum;<br /> int flag;<br /> int i;<br /> if (CompareBigInt(a,b) == -1)<br /> {<br /> ret = b;<br /> SubNum = a;<br /> flag = 1;<br /> } else {<br /> ret = a;<br /> SubNum = b;<br /> flag = 0;<br /> }<br /> for (i=0;i<ret.size;i++)<br /> {<br /> if (ret.data[i]<SubNum.data[i])<br /> {<br /> ret.data[i+1]--;<br /> ret.data[i] += MAXDIGIT;<br /> ret.data[i] -= SubNum.data[i];<br /> } else {<br /> ret.data[i] -= SubNum.data[i];<br /> }<br /> }<br /> while (ret.data[ret.size-1]==0||ret.data[ret.size-1]==-1)<br /> ret.size--;<br /> if (flag)<br /> ret.data[ret.size-1] = -ret.data[ret.size-1];<br /> return ret;<br />} </p><p>int main()<br />{<br /> char a[300], b[300];<br /> BigInt BigNum_a, BigNum_b, BigNum_c;<br /> while (scanf("%s%s", a,b)!=EOF)<br /> {<br /> BigNum_a = StrToBigInt(a);<br /> BigNum_b = StrToBigInt(b);<br /> BigNum_c = BigIntMul(BigNum_a, BigNum_b);<br /> printf("MUL:");<br /> PrintBigInt(BigNum_c);<br /> BigNum_c = BigIntSum(BigNum_a, BigNum_b);<br /> printf("SUM:");<br /> PrintBigInt(BigNum_c);<br /> BigNum_c = BigIntSub(BigNum_a, BigNum_b);<br /> printf("SUB:");<br /> PrintBigInt(BigNum_c);<br /> }<br /> return 0;<br />} </p><p>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.