#include <stdio.h>
//将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度。
void read(int num[])
{
int i;
char ch;
for (i = 0; i<500; i++)
num[i] = 0;
i = 1;
while ((ch = getchar()) != '
')
{
num[i] = ch - '0';
i++;
num[0]++;
}
}
//将数据num[]中的数翻转,以便计算
void rev(int num[])
{
int i, t;
for (i = 1; i <= num[0] / 2;i++)
{
t = num[i];
num[i] = num[num[0] + 1 - i];
num[num[0] + 1 - i] = t;
}
}
void print(int num[])
{
char character[11] = { "0123456789-" };//character[n]表示数字n的字符形式。character[10]='-'用于输出减法结果中的负号。
int i;
for (i = 1; i <= num[0]; i++)
printf("%c", character[num[i]]);
printf("
");
}
//将a[]和b[]的值相加,存储于sum[]中。
void add(int sum[], int a[], int b[])
{
//flag为进位标志位。
int i, flag = 0;
rev(a);
rev(b);
for (i = 1; i <= a[0] || i <= b[0]; i++)
sum[i] = a[i] + b[i];
if (a[0] > b[0])
sum[0] = a[0];
else
sum[0] = b[0];
for (i = 1; i <= sum[0]; i++)
{
sum[i] += flag;
if (sum[i] > 9)
{
sum[i] = sum[i] % 10;
flag = 1;
}
else
flag = 0;
}
if (1 == flag)
{
sum[0] += 1;
sum[i] = 1;
}
rev(sum);
rev(a);//加法运算完之后,再将a,b翻转回来。
rev(b);
}
void sub(int rst[], int a[], int b[])
{
int i;
int flag = 0;//flag为借位标志位。
rev(a);
rev(b);
for (i = 1; i <= a[0] || i <= b[0]; i++)
rst[i] = a[i] - b[i];
if (a[0] > b[0])
rst[0] = a[0];
else
rst[0] = b[0];
for (i = 1; i <= rst[0]; i++)
{
rst[i] += flag;
if (rst[i] < 0)
{
flag = -1;
rst[i] += 10;
}
else
flag = 0;
}
if (-1 == flag)
{
//此时,flag=-1表示a-b<0,故转换为求b-a。需要先将a,b翻转为原始数据
rev(a);
rev(b);
sub(rst,b,a);
//进行sub运算后,a,b,rst均为正常形式,需要将其翻转后,再添加负号。
rev(rst);
rev(a);
rev(b);
//在结果的最高位增加字符‘-’
rst[0]++;
rst[rst[0]] = 10;//如果某位为10,则输出时该位为“-”;
}
rev(rst);
rev(a);
rev(b);
}
int main()
{
int a[500], b[500], he[500], cha[500];
printf("Input a:");
read(a);
printf("Input b:");
read(b);
add(he, a, b);
sub(cha, a, b);
print(he);
print(cha);
return 0;
}