大整數運算之 大整數加法、減法、乘法

來源:互聯網
上載者:User

其實大整數的問題都是在像我們打草稿的時候列豎式一樣的,不要告訴我你不知道什麼叫豎式~!其實我開始也不知道它叫這個名字;

所謂豎式,就是你打草稿算算術的方法,小學知識;比如你寫 11+9:

11

+   9

----------

20

數A,B,求和,求差;數的長度不超過1000;

貼個代碼,先輸入一個數,代表資料的組數n,然後輸入n組A B

#include <iostream>using namespace std;#define base 4#define M 10000 char s1[1000],s2[1000];int A[251],B[251],sum[251];int max(int a,int b){return a>b?a:b;}void  trans(char *str, int *s)  //將一串數字字元 轉化為大整數 {int i,k = 1;int flag = strlen(str) - base;for(i = flag; i >= 0; i -= base,k++){s[k] = str[i] - '0';for(int j = i+1; j < i + base; j++){s[k] = s[k]*10 + str[j]-'0';}}i += base;s[k] = 0;for(int j = 0; j < i; j++){s[k] = s[k]*10 + str[j] - '0';}if(s[k])s[0] = k;elses[0] = k-1;} void prin(int *num){printf("%d",num[num[0]]);for(int i = num[0] - 1; i >= 1; i--){printf("%04d",num[i]);}}void copy(int *a,int *b)  //b複製給a {for(int i = 0; i <= b[0]; i++)a[i] = b[i];}int comp(int *a, int *b)  //比較大整數大小,a>b返回1,a<b返回-1,相等返回0 {if(a[0] > b[0])return 1;if(a[0] < b[0])return -1;for(int i = a[0]; i >= 1 ; i--){if(a[i] > b[i])return 1;if(a[i] < b[i])return -1;}return 0;} void add(int *A,int *B, int *sum){int i,d[1000];if((B[0]==1)&&(B[1]==0)){copy(sum,A);return;}if((A[0]==1)&&(A[1]==0)){copy(sum,B);return;}if (A[0] >= B[0]) { copy(sum,A);copy(d,B);} else { copy(sum,B);copy(d,A);}//轉換為sum + d(即A、B的最大值和最小值);最終結果為sum sum[sum[0] + 1] = 0;   //存放可能出現的進位 for (i = 1; i <= d[0]; i++) //處理位元相同的 {    sum[i]+=d[i];         if (sum[i]>=M){      sum[i]-=M;  sum[i+1]++; } }    for (; i <= sum[0]; i++)  //處理A、B中大的多出來的位元 {if(sum[i]>=M) {sum[i] -= M;sum[i+1]++;} else break; }if (sum[sum[0]+1]>0)sum[0] = sum[0] + 1;}void sub(int *A, int *B, int *ans)//大整數相減,預設A大於B {int D[1000];int i; copy(ans,A);copy(D,B);for(i = 1; i <= D[0]; i++){if(ans[i] < D[i]){ans[i] += M;ans[i+1]--;}ans[i] -= D[i];}for(; i < ans[0]; i++){if(ans[i]<0){ans[i]+=M;ans[i+1]--;}else break;}if(!ans[ans[0]])ans[0]--;} void mult(int *a,int *b,int *ans){int k= a[0]+b[0]-1;//Base<=10000 /*m位元 *n位元 = m+n-1位 或 m+n 位元  */for(int i=0;i<=k;i++)ans[i]=0;// step 1:a[1],a[2]....,a[m]//         b[1]//         c[1],c[2],...,c[m] //step 2: a[1],a[2]....,a[m]//              b[2]//        c[1],c[2],...,c[m] //step 3:... ...for(int i=1;i<=b[0];i++) //b[] 在乘法豎式下方{ int now_i = i;if(b[i])   //b[i]為0時,ans[now_i]也為0,不考慮 for(int j=1;j<=a[0];j++,now_i++)  //a[]在乘法豎式上方{ans[now_i]+=a[i]*b[j];if(ans[now_i]>=M)   //求餘進位 {ans[now_i+1]+=ans[now_i]/M;ans[now_i]%=M;}}}//再次求餘進位,// 2  9999 9999// 2  9999 9999//--------------//step 1: 9999 9999//        9999  //        0001  0002 9997 進位餘數9999  然後是(9999+9999)*9999,99970002     if(ans[k+1])           k++;ans[0]=k;}int main(){int T,k = 1;cin>>T;while(T--){cin.get();scanf("%s%s",s1,s2);trans(s1,A); trans(s2,B);add(A,B,sum);printf("Case %d:\n",k);prin(A);cout<<" + ";prin(B);cout<<" = ";prin(sum);cout<<endl;int fl = 1;if(comp(A,B)!=-1)fl=0,sub(A,B,sum);elsesub(B,A,sum);printf("Case %d:\n",k);prin(A);cout<<" - ";prin(B);cout<<" = ";if(fl)cout<<"-";prin(sum);cout<<endl;mult(A,B,sum);printf("Case %d:\n",k++);prin(A);cout<<" * ";prin(B);cout<<" = ";prin(sum);cout<<endl;if(T)cout<<endl;}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.