【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的减法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1. 第一行是超长正整数A;
2. 第二行是超长正整数B;
【输出形式】
输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。
【输入样例】
234098 134098703578230056
【输出样例】
-134098703577995958
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[100]="\0";
char arr2[100]="\0";
int arr3[100]={0};
int i = 0;
scanf("%s%s", &arr1, &arr2);//输入数据
int m1 = strlen(arr1);//计算字符串长度
int m2 = strlen(arr2);
int j = 0;
int count = 0;
int Arr1[100] = { 0 };
int Arr2[100] = { 0 };
int max = m1 > m2 ? m1 : m2;
for (i = 0; i < m1; i++)Arr1[i] = arr1[i] - '0';//转化为整数
for (i = 0; i < m2; i++)Arr2[i] = arr2[i] - '0';
//减法操作
if (m1 > m2 || (m1==m2&& (strcmp(arr1, arr2) > 0)))//保证相减后的数大于零
for (i = max - 1, j = m2 - 1; i >= 0; i--, j--)
if (j >= 0)
{
arr3[i] += Arr1[i] - Arr2[j];
if (arr3[i] < 0) { arr3[i] += 10; arr3[i - 1] = -1; }
}
else
{
arr3[i] += Arr1[i];
if (arr3[i] < 0) { arr3[i] += 10; arr3[i - 1] = -1; }
}
else
for (i = max - 1, j = m1 - 1; i >= 0; i--, j--)
if (j >= 0)
{
arr3[i] += Arr2[i] - Arr1[j];
if (arr3[i] < 0) { arr3[i] += 10; arr3[i - 1] = -1; }
}
else
{
arr3[i] += Arr2[i];
if (arr3[i] < 0) { arr3[i] += 10; arr3[i - 1] = -1; }
}
if (m1 < m2 || (m1==m2&&strcmp(arr1, arr2) < 0))
printf("-");
i = 0;
while (arr3[i] == 0)i++;//去除差前边的0
for (i; i < max; i++)
{
count++;
printf("%d", arr3[i]);
}
if (count == 0)
{
printf("0");
}
return 0;
}