|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
#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<n2时返回负整数
|
|
|
//比完大小后,发现被减数小于减数,就交换。
|
|
|
{
|
|
|
strcpy(n, n1); //将n1数组的值完全赋值给n数组
|
|
|
strcpy(n1, n2);
|
|
|
strcpy(n2, n);
|
|
|
swap(lena, lenb); //这步不能忘
|
|
|
//printf("-"); //别忘了输出负号
|
|
|
needFuHao = true;
|
|
|
}
|
|
|
for (i = 0; i < lena; i++) a[lena - i] = int(n1[i] - '0');
|
|
|
for (i = 0; i < lenb; i++) b[lenb - i] = int(n2[i] - '0');
|
|
|
i = 1;
|
|
|
while (i <= lena || i <= lenb) {
|
|
|
if (a[i] < b[i]) //借位
|
|
|
{
|
|
|
a[i] += 10;
|
|
|
a[i + 1]--;
|
|
|
}
|
|
|
c[i] = a[i] - b[i];
|
|
|
i++;
|
|
|
}
|
|
|
int lenc = i;
|
|
|
while (c[lenc] == 0 && lenc > 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;
|
|
|
} |