#include <stdio.h>
#include <string.h>
#define N 1000
char str[N];
int a[N], b[N];
int sum[N], difference[N], product[N];//和、差、积
void Zero(int num[N])
{//将数组清零
for(int i = 0; i < N; i++) num[i]=0;
}
int GetNum(int num[N], char str[N])
{//从字符串中取得大数,去掉符号并把低位存在前面
int len = strlen(str);
int ret = 1;//假设是正数
int i = 0, j = 0;
Zero(num);
if (str[0] == '-') {
j++;
ret = -1;
}
while (j < len) num[i++] = str[j++] - '0';
int begin = 0, end = len - 1, tmp;
if (str[0] == '-') end--;
while (begin < end) {//把数字转换为低位在前高位在后
tmp = num[begin];
num[begin] = num[end];
num[end] = tmp;
begin++;
end--;
}
return ret;//返回值是数的正负,负为-1,否则为1
}
int Cmp(int a[N], int b[N])
{//比较a、b的大小,>返回1,<返回-1,=返回0
for (int i = N - 1; i >= 0; i--) {
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
void Swap(int a[N], int b[N])
{//交换a、b的值
int tmp;
for (int i = 0; i < N; i++) {
tmp = a[i];
a[i] = b[i];
b[i] = tmp;
}
}
void Add(int sum[N], int a[N], int b[N])
{//求两个正数之和
Zero(sum);
for (int i = 0; i < N - 1; i++) {
sum[i] += a[i] + b[i];
if (sum[i] >= 10) {
sum[i + 1] += sum[i] / 10;
sum[i] = sum[i] % 10;
}
}
}
void Subtract(int difference[N], int a[N], int b[N])
{//求两个正数差的绝对值
Zero(difference);
if (Cmp(a, b) == -1) Swap(a, b);
for (int i = 0; i < N; i++) {
difference[i] = a[i] - b[i];
}
for (int i = 0; i < N - 1; i++) {//从低到高借位
while (difference[i] < 0) {
difference[i] += 10;
difference[i + 1]--;
}
}
}
void Multi(int product[N], int a[N], int b[N])
{//求两个正数的积
Zero(product);
if (Cmp(a, b) == -1) Swap(a, b);
//不知道尽量让b小能不能提高效率?
int hb = N - 1, ha = N - 1;
while (b[hb] == 0) hb--;//找到b的最高位
while (a[ha] == 0) ha--;//找到a的最高位
for (int i = 0; i <= hb; i++) {
for (int j = 0; j <= ha && i + j < N; j++) {
product[i + j] += b[i] * a[j];
}
}
for (int i = 0; i < N - 1; i++) {//处理进位
if (product[i] >= 10) {
product[i + 1] += product[i] / 10;
product[i] = product[i] % 10;
}
}
}
void Output(int num[N])
{//输出一个数
int high = N - 1;
while (num[high] == 0 && high > 0) high--;//找到最高位
for (int i = high; i >= 0; i--) {
printf("%d", num[i]);
}
printf("\n");
}
int main()
{
int ta, tb, t;//a的符号、b的符号、得数的符号
while (scanf("%s", str) != EOF) {
ta = GetNum(a, str);
scanf("%s", str);
tb = GetNum(b, str);
//加法
if (ta == tb) {//同为正或同为负
Add(sum, a, b);
if (ta == -1) printf("-");//可能需要输出个负号
Output(sum);
} else {//不同号,那加法实际上就是算减法
if(ta == 1) {//如果a正b负
if (Cmp(a, b) == -1) t = -1;
else t = 1;
} else {//如果a负b正
if (Cmp(a, b) == 1) t = -1;
else t = 1;
}
Subtract(difference, a, b);
if (t == -1) printf("-");//可能需要输出个负号
Output(difference);
}
//接下来是减法,其实就是a+(-b),基本照抄前面
tb = -tb;//b取反号
if (ta == tb) {//同为正或同为负
Add(sum, a, b);
if (ta == -1) printf("-");//可能需要输出个负号
Output(sum);
} else {//不同号,那加法实际上就是算减法
if (ta == 1) {
if (Cmp(a, b) == -1) t = -1;
else t = 1;
} else {//如果a负b正
if (Cmp(a, b) == 1) t = -1;
else t = 1;
}
Subtract(difference, a, b);
if (t == -1) printf("-");//可能需要输出个负号
Output(difference);
}
tb = -tb;//把b的符号变回来
t = ta * tb;
if (t == -1) printf("-");//可能需要输出个负号
Multi(product, a, b);
Output(product);
}
return 0;//大功告成
}
参考 https://www.nowcoder.com/profile/539068368/codeBooks