zoukankan      html  css  js  c++  java
  • [51NOD]大数加法(模拟)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

    要处理符号,还要特别注意0和连续进位等情况。偷懒使用strcmp,但是前提必须是长度相等,否则是字典序。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <fstream>
     8 #include <cassert>
     9 #include <cstdio>
    10 #include <bitset>
    11 #include <vector>
    12 #include <deque>
    13 #include <queue>
    14 #include <stack>
    15 #include <ctime>
    16 #include <set>
    17 #include <map>
    18 #include <cmath>
    19 
    20 using namespace std;
    21 
    22 const int maxn = 11111;
    23 char ca[maxn], cb[maxn], cs[maxn];
    24 
    25 void add(char* ca, char* cb) {
    26     int a[maxn];
    27     int b[maxn];
    28     memset(a, 0, sizeof(a));
    29     memset(b, 0, sizeof(b));
    30     int la = strlen(ca);
    31     int lb = strlen(cb);
    32     for(int i = 0; i < la; i++) a[i] = ca[la-i-1] - '0';
    33     for(int i = 0; i < lb; i++) b[i] = cb[lb-i-1] - '0';
    34     for(int i = 0; i < maxn; i++) {
    35         a[i] += b[i];
    36         a[i+1] += a[i] / 10;
    37         a[i] %= 10;
    38     }
    39     int p = maxn;
    40     while(p--) if(a[p] != 0) break;
    41     for(int i = p; i >= 0; i--) printf("%d", a[i]);
    42     printf("
    ");
    43 }
    44 
    45 void sub(char* ca, char* cb) {
    46     int a[maxn];
    47     int b[maxn];
    48     memset(a, 0, sizeof(a));
    49     memset(b, 0, sizeof(b));
    50     int la = strlen(ca);
    51     int lb = strlen(cb);
    52     for(int i = 0; i < la; i++) a[i] = ca[la-i-1] - '0';
    53     for(int i = 0; i < lb; i++) b[i] = cb[lb-i-1] - '0';
    54     for(int i = 0; i < la; i++) {
    55         if(a[i] >= b[i]) a[i] -= b[i];
    56         else {
    57             a[i] = a[i] - b[i] + 10;
    58             a[i+1]--;
    59         }
    60     }
    61     int p = maxn;
    62     while(p--) if(a[p] != 0) break;
    63     for(int i = p; i >= 0; i--) printf("%d", a[i]);
    64     printf("
    ");
    65 }
    66 
    67 int main() {
    68     // freopen("in", "r", stdin);
    69     memset(ca, 0, sizeof(ca));
    70     memset(cb, 0, sizeof(cb));
    71     scanf("%s %s", ca, cb);
    72     int la = strlen(ca);
    73     int lb = strlen(cb);
    74     if(ca[0] == '0' && cb[0] == '0') printf("0
    ");
    75     else if(ca[0] == '-' && cb[0] == '-') {
    76         printf("-");
    77         add(ca+1, cb+1);
    78     }
    79     else if(ca[0] != '-' && cb[0] != '-') add(ca, cb);
    80     else if(ca[0] == '-' && cb[0] != '-') {
    81         if(la - 1 < lb) sub(cb, ca+1);
    82         else if(strcmp(ca+1, cb) > 0) {
    83             printf("-");
    84             sub(ca+1, cb);
    85         }
    86         else if(strcmp(ca+1, cb) == 0) printf("0
    ");
    87         else sub(cb, ca+1);
    88     }
    89     else if(ca[0] != '-' && cb[0] == '-') {
    90         if(la - 1 < lb) sub(ca, cb+1);
    91         else if(strcmp(ca, cb+1) > 0) sub(ca, cb+1);
    92         else if(strcmp(ca, cb+1) == 0) printf("0
    ");
    93         else {
    94             printf("-");
    95             sub(cb+1, ca);
    96         }
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    简单命令行总结
    [大餐]开发摘记1--我的Fragment通信的框架 | 卖牙膏的芖口钉
    DZNEmptyDataSet的使用
    Java笔记(一)
    mingster.com
    2014新年福利,居然有人将Ext JS 4.1的文档翻译了
    【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三
    【翻译】在Ext JS应用程序中使用自定义图标
    【翻译】Siesta事件记录器入门
    【翻译】使用新的Sencha Cmd 4命令app watch
  • 原文地址:https://www.cnblogs.com/kirai/p/5408224.html
Copyright © 2011-2022 走看看