#include #define N 10001 using namespace std; /** * 功能:整数数组转为字符串,length为有效数字的长度 * @param a * @param length * @return */ string IntArrayToStr(int a[], int length) { char buff[10], b[500]; int i; b[0] = '\0'; for (i = 0; i < length; i++) { sprintf(buff, "%d", a[i]); strcat(b, buff); } return b; } /** * 功能:高精度加法 * @param a1 * @param b1 * @return */ string Add(char *a1, char *b1) { int a[N], b[N], c[N], i, x = 0; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); int lena = strlen(a1); int lenb = strlen(b1); for (i = 0; i < lena; i++) a[lena - i] = a1[i] - 48; //注意,这里是反着放的 for (i = 0; i < lenb; i++) b[lenb - i] = b1[i] - 48; //注意,这里是反着放的 int lenc = 1; while (lenc <= lena || lenc <= lenb) { c[lenc] = a[lenc] + b[lenc] + x; //两数相加 x = c[lenc] / 10; c[lenc] %= 10; lenc++; } c[lenc] = x; if (c[lenc] == 0) lenc--; //处理最高位 //数组左移一位,此代码由黄海增加于2020-11-20 for (i = 1; i <= lenc; i++) { c[i - 1] = c[i]; } //将整数数组转为字符串 return IntArrayToStr(c, lenc); } /** * 功能:高精度减法 * @param n1 * @param n2 */ string Subtract(char *n1, char *n2) { int a[N], b[N], c[N], i; char n[N]; bool needFuHao = false; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); int lena = strlen(n1), lenb = strlen(n2); if (lena < lenb || (lena == lenb && strcmp(n1, n2) < 0)) //strcmp()为字符串比较函数,当n1=n2时,返回0, //n1>n2时,返回正整数;n1 1) lenc--; //最高位为0,则不输出 //数组左移一位,此代码由黄海增加于2020-11-20 for (i = 1; i <= lenc; i++) { c[i - 1] = c[i]; } //将整数数组转为字符串 return needFuHao ? "-" + IntArrayToStr(c, lenc) : IntArrayToStr(c, lenc); } //高精度乘法 string Multi(char *a1, char *b1, int lena, int lenb) { int a[N], b[N], c[N], x; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); for (int i = 0; i < lena; i++) a[lena - i] = a1[i] - 48; for (int i = 0; i < lenb; i++) b[lenb - i] = b1[i] - 48; for (int i = 0; i <= lena; i++) { x = 0; //用来存放进位 for (int j = 1; j <= lenb; j++) { c[i + j - 1] += a[i] * b[j] + x; x = c[i + j - 1] / 10; c[i + j - 1] %= 10; } c[i + lenb] = x; //进位 } int lenc = lena + lenb; while (c[lenc] == 0 && lenc > 1) lenc--; //删除前导0 //数组左移一位,此代码由黄海增加于2020-11-20 for (int i = 1; i <= lenc; i++) { c[i - 1] = c[i]; } //将整数数组转为字符串 return IntArrayToStr(c, lenc); } int main() { //接收操作数 char a1[N]; char b1[N]; cin >> a1 >> b1; //高精度加法 string sum = Add(a1, b1); cout << sum << endl; //高精度减法 string dec = Subtract(a1, b1); cout << dec << endl; //高精度乘法 string result = Multi(a1, b1, strlen(a1), strlen(b1)); cout << result << endl; return 0; }