首页 > 代码库 > 拼命拯救自己的ACM

拼命拯救自己的ACM

                                     ACM精度简单题   

                                          大数相加

描述

求两个不超过200位的非负整数的和。

输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

2222222222222222222233333333333333333333

样例输出

55555555555555555555

AC代码
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;#define MAX_LEN 200int an1[MAX_LEN + 10];int an2[MAX_LEN + 10];char szLine1[MAX_LEN + 10];char szLine2[MAX_LEN + 10];int main(){    cin >> szLine1;    cin >> szLine2;    int i, j;    memset(an1, 0, sizeof(an1));    memset(an2, 0, sizeof(an2));    int len1 = strlen(szLine1);    int len2 = strlen(szLine2);    int maxx = max(len1, len2) + 1;    for (i = len1 - 1, j = 0; i >= 0; i--){        an1[j++] = szLine1[i] - 0;    }    for (i = len2-1,j=0; i>=0 ; i--){        an2[j++] = szLine2[i] - 0;    }        for (j = 0; j < maxx; j++){        an1[j] += an2[j];        if (an1[j] >= 10){            an1[j] -= 10;            an2[j + 1]++;        }    }    for (i = maxx; (i >= 0) && (an1[i] == 0); i--);    if (i >= 0)        for (; i >= 0; i--)            cout << an1[i];    else cout << "0";        return 0;}

                                         

                                           大数乘法

算法思想:每个位相乘的结果放在一个位置上,错位叠加后,对于大于10的部分,十位加到前面,保留个位。

 

AC代码:

 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<string> 5 #include<cstring> 6 #define MAX_LEN 200 7 using namespace std; 8  9 char s1[MAX_LEN + 10];10 char s2[MAX_LEN + 10];11 int an1[MAX_LEN + 10];12 int an2[MAX_LEN + 10];13 int ans[MAX_LEN * 2 + 10];14 15 int main()16 {17     cin >> s1;18     cin >> s2;19     memset(an1, 0, sizeof(an1));20     memset(an2, 0, sizeof(an2));21     memset(ans, 0, sizeof(ans));22     int len1 = strlen(s1);23     int len2 = strlen(s2);24     int maxx = len1 + len2 + 1;25     int i, j;26     for (i = 0, j = len1 - 1; j>=0; j--){27         an1[i++] = s1[j] - 0;28     }29     for (i = 0, j = len2 - 1; j >= 0; j--){30         an2[i++] = s2[j] - 0;31     }32     for (i = 0; i < len2; i++){33         for (j = 0; j < len1; j++){34             ans[i + j] += an2[i] * an1[j];35         }36     }37     for (i = 0; i < maxx; i++){38         if (ans[i] >= 10){39             ans[i + 1] += ans[i] / 10;40             ans[i] %= 10;41         }42     }43     for (i = maxx; (ans[i] == 0 && (i >= 0)); i--);44         if (i >= 0)45             for (; i >= 0; i--)46                 cout << ans[i];47         else48             cout << "0";49     return 0;50 }

 

拼命拯救自己的ACM