zoukankan      html  css  js  c++  java
  • 大数加减法

      1 #include <cstdio>
      2 #include <cstring>
      3 using namespace std;
      4 #define MAX 10005
      5 
      6 struct bigint
      7 {
      8     char num[MAX];
      9     int flag;  // 1:positive -1:negative
     10     int dgts;
     11     bigint(void)
     12     {
     13         memset(num, '0', sizeof(num));
     14     }
     15 };
     16 
     17 void BigIntTrans(char str[], bigint* a)   //convert string to the structure of bigint
     18 {
     19     int i, k, len;
     20     len = strlen(str);
     21     a->flag = 1;
     22     a->dgts = len;
     23     k = 0;
     24     for(i = len - 1; i >= 1; --i)
     25         a->num[k++] = str[i];
     26     if(str[0] == '-') {
     27         a->flag = -1;
     28         --a->dgts;
     29     }
     30     else {
     31         a->num[k++] = str[i];
     32     }
     33 }
     34 
     35 void BigIntPrint(bigint* a)
     36 {
     37     int i;
     38     if(a->flag == -1) printf("-");
     39     if(a->dgts == 1 && a->num[0] == '0') {
     40         printf("0
    ");
     41         return;
     42     }
     43     i = a->dgts - 1;
     44     while(a->num[i] == '0')
     45         --i;
     46     for( ; i >= 0; --i) {
     47         printf("%c", a->num[i]);
     48     }
     49     printf("
    ");
     50 }
     51 
     52 void add(bigint* a, bigint* b, bigint* ans)
     53 {
     54     int i, c=0, len, tmp;
     55     len = (a->dgts >= b->dgts? a->dgts:b->dgts);
     56     for(i = 0; i < len; ++i) {
     57         tmp = (a->num[i]-'0') + (b->num[i]-'0') + c;
     58         if(tmp >= 10){
     59             c = 1;
     60             ans->num[i] = (tmp % 10) + '0';
     61         }
     62         else {
     63             c = 0;
     64             ans->num[i] = tmp + '0';
     65         }
     66     }
     67     if(c) {
     68         ans->num[i] = '1';
     69         ans->dgts = len + 1;
     70     }
     71     else ans->dgts = len;
     72     if(a->flag + b->flag == 2) ans->flag = 1;
     73     else ans->flag = -1;
     74 }
     75 
     76 void sub(bigint* a, bigint* b, bigint* ans)
     77 {
     78     int i, c=0, tmp;
     79     for(i = 0; i < a->dgts; ++i) {
     80         tmp = (a->num[i]-'0') - (b->num[i]-'0') - c;
     81         if(tmp >= 0) {
     82             ans->num[i] = tmp + '0';
     83             c = 0;
     84         }
     85         else {
     86             ans->num[i] = tmp + 10 + '0';
     87             c = 1;
     88         }
     89     }
     90     ans->dgts = a->dgts;
     91     ans->flag = a->flag;
     92 }
     93 
     94 int cmpabs(bigint* a, bigint* b)
     95 {
     96     if(a->dgts > b->dgts)
     97         return 1;
     98     else if(a->dgts < b->dgts)
     99         return 2;
    100     else {
    101         for(int i = a->dgts - 1; i >= 0; --i) {
    102             if(a->num[i] > b->num[i]) return 1;
    103             else if(a->num[i] < b->num[i]) return 2;
    104             else continue;
    105         }
    106         return 0;
    107     }
    108 }
    109 
    110 void BigIntAdd(bigint* a, bigint* b, bigint* ans)
    111 {
    112     int flag;
    113     if(a->flag * b->flag == 1)
    114         add(a, b, ans);
    115     else if(a->flag * b->flag == -1) {
    116         flag = cmpabs(a, b);
    117         if(flag == 1) sub(a, b, ans);
    118         else if(flag == 2) sub(b, a, ans);
    119         else {
    120             ans->dgts = 1;
    121             ans->num[0] = '0';
    122             ans->flag = 1;
    123         }
    124     }
    125 
    126 }
    127 
    128 char str1[MAX], str2[MAX];
    129 
    130 int main()
    131 {
    132     bigint a, b, ans;
    133     scanf("%s%s", str1, str2);
    134     BigIntTrans(str1, &a);
    135     BigIntTrans(str2, &b);
    136     sub(&a, &b, &ans);
    137     BigIntPrint(&ans);
    138     BigIntAdd(&a, &b, &ans);
    139     BigIntPrint(&ans);
    140     return 0;
    141 }
  • 相关阅读:
    算法
    用python代码编写象棋界面,棋盘覆盖问题
    深浅拷贝的原理
    MongoDB简介,安装,增删改查
    DBUtils-Python数据库连接池
    websocket
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    跨域
    最长公共子序列/子串 LCS(模板)
    寒假作业---蓝桥杯---DFS
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/6791629.html
Copyright © 2011-2022 走看看