wojiaocbj

bignum-add-subtract

Mar 29th, 2022
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.13 KB | None | 0 0
  1. /*
  2.  Author: 曹北健(37509)
  3.  Result: AC Submission_id: 4121874
  4.  Created at: Sun Mar 06 2022 10:47:42 GMT+0800 (China Standard Time)
  5.  Problem: 5391  Time: 3 Memory: 1736
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>
  11. #include <math.h>
  12. #include <string.h>
  13. #pragma warning(disable:4996)
  14. #define N 10
  15. typedef long long LL;
  16. typedef struct cbj0{
  17.     short num[10020];
  18.     char sgn;
  19.     int len;
  20. }bignum;
  21. bignum A, B, *T;
  22. char buf1[10020], buf2[10020];
  23. int compabs(bignum *, bignum *);
  24. bignum *add0(bignum *, bignum *);
  25. bignum *subtract0(bignum *, bignum *);
  26. bignum *add(bignum *, bignum *);
  27. bignum *subtract(bignum *, bignum *);
  28. void reverse(short *a, int n){
  29.     int i, tmp;
  30.     for(i = 0;i < n / 2;i++){
  31.         tmp = a[i];
  32.         a[i] = a[n - 1 - i];
  33.         a[n - 1 - i] = tmp;
  34.     }
  35. }
  36. void input(char *buf, bignum *a){
  37.     int loc = 0;
  38.     if(buf[0] == '-'){ a->sgn = '-'; loc++; }
  39.     else a->sgn = '+';
  40.     int cnt = 0, i;
  41.     while(buf[loc] != '\0'){
  42.         a->num[cnt] = buf[loc] - '0';
  43.         loc++;cnt++;
  44.     }
  45.     for(i = cnt;i < 10020;i++)a->num[i] = 0;
  46.     a->len = cnt;
  47.     reverse(a->num, cnt);
  48. }
  49. int iszero(bignum *p){
  50.     int i;
  51.     for(i = p->len;i >= 0;i--){
  52.         if(p->num[i] != 0)return 0;
  53.     }
  54.     return 1;
  55. }
  56. bignum *add(bignum *a, bignum *b){
  57.     bignum *tmp;
  58.     if(a->sgn == b->sgn){
  59.         tmp = add0(a, b);
  60.     }
  61.     else{//异号
  62.         if(compabs(a, b) >= 0){
  63.             tmp = subtract0(a, b);
  64.         }
  65.         else{
  66.             tmp = subtract0(b, a);
  67.         }
  68.     }
  69.     return tmp;
  70. }
  71. int compabs(bignum *a, bignum *b){
  72.     if(a->len > b->len)return 1;
  73.     else{
  74.         if(a->len < b->len)return -1;
  75.         else{
  76.             int i = a->len - 1;
  77.             while(i >= 0){
  78.                 if(a->num[i] > b->num[i])return 1;
  79.                 if(a->num[i] < b->num[i])return -1;
  80.                 i--;
  81.             }
  82.             return 0;
  83.         }
  84.     }
  85. }
  86. bignum *add0(bignum *a, bignum *b){//ab同号
  87.     int i = 0;
  88.     while(i < a->len || i < b->len){
  89.         short sum = 0;
  90.         sum = (a->num[i]) + (b->num[i]);
  91.         if(sum >= N){//进位
  92.             a->num[i] = sum % N;
  93.             a->num[i + 1] += sum / N;
  94.         }
  95.         else{
  96.             a->num[i] = sum;
  97.         }
  98.         i++;
  99.     }
  100.     if(a->num[i] != 0){
  101.         i++;
  102.     }
  103.     a->len = i;
  104.     return a;
  105. }
  106. bignum *subtract0(bignum *a, bignum *b){//a>=b>=0
  107.     int i = 0, cnt = 0;
  108.     while(i < a->len){
  109.         short tmp = a->num[i] - b->num[i];
  110.         if(tmp < 0){
  111.             a->num[i + 1] -= 1;
  112.             a->num[i] = tmp + N;
  113.         }
  114.         else{
  115.             a->num[i] = tmp;
  116.         }
  117.         cnt++;i++;
  118.     }
  119.     for(i = cnt - 1;i >= 0;i--){
  120.         if(a->num[i] == 0){
  121.             cnt--;
  122.         }
  123.         else{
  124.             break;
  125.         }
  126.     }
  127.     if(cnt == 0)cnt++;
  128.     a->len = cnt;
  129.     return a;
  130. }
  131. int main(){
  132. #ifdef _DEBUG
  133.     freopen("input.txt", "r", stdin);
  134.     freopen("output.txt", "w", stdout);
  135. #endif
  136.     int i, p;//sgn为1表示正数 -1表示负数
  137.     scanf("%d", &p);
  138.     while(p--){
  139.         memset(buf1, 0, sizeof(buf1));
  140.         memset(buf2, 0, sizeof(buf2));
  141.         scanf("%s%s", buf1, buf2);
  142.         memset(&A, 0, sizeof(bignum));
  143.         memset(&B, 0, sizeof(bignum));
  144.         input(buf1, &A);
  145.         input(buf2, &B);
  146.         T = add(&A, &B);
  147.         if(iszero(T)){
  148.             printf("0\n");
  149.         }
  150.         else{
  151.             if(T->sgn == '-'){ putchar('-'); }
  152.             for(i = T->len - 1;i >= 0;i--){
  153.                 printf("%d", T->num[i]);
  154.             }
  155.             putchar('\n');
  156.         }
  157.     }
  158. #ifdef _DEBUG
  159.     freopen("CON", "r", stdin);
  160.     freopen("CON", "w", stdout);
  161.     system("pause");
  162. #endif
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment