You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.1 KiB

2 years ago
#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;
}