• 大数加减法实现


    传送门

      1 /*
      2  * input: an expression seperated by a '-' or '+'; for example: a-b, a+b
      3  * ouput: the answer of the input expression
      4 */
      5 #include <stdio.h>
      6 #include <string.h>
      7 
      8 #define MAX_N 205
      9 
     10 char a[MAX_N], b[MAX_N], ans[MAX_N];
     11 char op;
     12 
     13 void reverse(char *s) {
     14     size_t len = strlen(s);
     15     size_t i;
     16 
     17     for (i = 0; i < (len>>1); i++) {
     18         s[i] ^= s[len-i-1];
     19         s[len-i-1] ^= s[i];
     20         s[i] ^= s[len-i-1];
     21     }
     22 }
     23 
     24 void balance(char *a, char *b) {
     25     size_t len_a = strlen(a);
     26     size_t len_b = strlen(b);
     27 
     28     while (len_a < len_b) {
     29         a[len_a++] = '0';
     30         a[len_a] = '';
     31     }
     32     while (len_b < len_a) {
     33         b[len_b++] = '0';
     34         b[len_b] = '';
     35     }
     36 }
     37 
     38 void reduce(char *s) {
     39     size_t len = strlen(s);
     40     
     41     while (len > 1 && s[len-1] == '0') len--;
     42     s[len] = '';
     43 }
     44 
     45 void add(char *res, char *a, char *b) {
     46     reverse(a);
     47     reverse(b);
     48     balance(a, b);
     49 
     50     size_t n = strlen(a);
     51     size_t i;
     52     int c = 0, x;
     53     char s[MAX_N];
     54 
     55     for (i = 0; i < n; i++) {
     56         x = (a[i] - '0') + (b[i] - '0') + c;                
     57         c = x / 10;
     58         s[i] = x % 10 + '0';                
     59     }
     60     if (c > 0) s[i++] = c + '0';
     61     s[i] = '';
     62 
     63     reduce(a);
     64     reduce(b);
     65     reverse(a);
     66     reverse(b);
     67     reverse(s);
     68 
     69     strcpy(res, s);
     70 }
     71 
     72 void sub(char *res, char *a, char *b) {
     73     if (strlen(a) < strlen(b) || (strlen(a) == strlen(b) && strcmp(a, b) < 0)) {
     74         res[0] = '-';
     75         sub(res+1, b, a);
     76         return ;
     77     }    
     78 
     79     reverse(a);
     80     reverse(b);
     81     balance(a, b);
     82 
     83     char s[MAX_N];
     84     size_t n = strlen(a);
     85     size_t i;
     86 
     87     int c = 0, x;
     88     for (i = 0; i < n; i++) {
     89         x = a[i] - b[i] - c;
     90         c = 0;
     91         if (x < 0) {
     92             x += 10;
     93             c = 1;        
     94         }    
     95         s[i] = x + '0';
     96     }
     97     
     98     s[n] = '';
     99     
    100     reduce(s);
    101     reduce(b);
    102     reverse(a);
    103     reverse(b);
    104     reverse(s);
    105     strcpy(res, s);
    106 }
    107 
    108 void input() {
    109     char s[MAX_N];
    110     scanf("%s", s);
    111 
    112     size_t len = strlen(s);
    113     size_t i;
    114     for (i = 0; i < len; i++) 
    115         if (s[i] != '-' && s[i] != '+') a[i] = s[i];
    116         else break;
    117     a[i] = '';
    118 
    119     op = s[i];
    120 
    121     strcpy(b, s+i+1);
    122 }
    123 
    124 void output()  {
    125     if (op == '-') 
    126         sub(ans, a, b);
    127     else
    128         add(ans, a, b);
    129     puts(ans);
    130 }
    131 
    132 int main(void) {
    133     int T;
    134     scanf("%d", &T);
    135     while ( T-->0) {
    136         input();    
    137         output();
    138     }
    139 
    140     return 0;
    141 }
  • 相关阅读:
    剑指offer二十二之从上往下打印二叉树
    剑指offer二十一之栈的压入、弹出序列
    Hadoop简介与伪分布式搭建—DAY01
    getopt解析命令行参数一例:汇集多个服务器的日志
    软件开发:如何表达和维护大型逻辑
    编程语言与可复用性
    危险的 SQL
    谁终将点燃闪电,必长久如云漂泊
    如何使错误日志更加方便排查问题
    生活的诀窍:任务激励式学习法和短小目标法
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/4224015.html
Copyright © 2020-2023  润新知