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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}