Advertisement
wojiaocbj

bignum

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