zzulioj - 2624: 小H的奇怪加法(模拟)
题目链接:http://acm.zzuli.edu.cn/problem.php?id=2624
模拟加法进位就行了,写起来和高精度加法类似。
#include<set> #include<map> #include<stack> #include<queue> #include<cmath> #include<cstdio> #include<cctype> #include<string> #include<vector> #include<climits> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define max(a, b) (a > b ? a : b) #define min(a, b) (a < b ? a : b) #define mst(a) memset(a, 0, sizeof(a)) #define _test printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n") using namespace std; typedef long long ll; typedef pair<int, int> P; const double eps = 1e-7; const int INF = 0x3f3f3f3f; const ll ll_INF = 0x3f3f3f3f3f3f3f; const int maxn = 1e3+10; char ls[20]; char num1[maxn], num2[maxn], res[maxn]; void add() { //高精度整数加法(改) mst(res); int len1 = strlen(num1); int len2 = strlen(num2); int len3 = strlen(ls); reverse(num1, num1+len1); reverse(num2, num2+len2); int len, carry; len = carry = 0; for (int i = 0; i<len1 || i<len2; ++i) { carry += i<len1 ? num1[i] - '0' : 0; carry += i<len2 ? num2[i] - '0' : 0; if (ls[len3-i-1] != '0') { //非0即为2~9进制 res[len] = carry%(ls[len3-i-1]-'0') + '0'; carry /= (ls[len3-i-1] - '0'); } else { //是0就按10进制 res[len] = carry%10 + '0'; carry /= 10; } ++len; } if (carry) //判断最后一位是不是有进位 res[len++] = carry + '0'; res[len] = 0; for (int i = len-1; i>0; --i) { //排除先导0的影响 注意 不能直接i>=0, 如果结果刚好等于0就会出错了 if (res[i] == '0') res[i] = 0; else break; } reverse(res, res+strlen(res)); } int main(void) { scanf("%s %s %s", ls, num1, num2); add(); printf("%s\n", res); return 0; }