分析
模拟平时做竖式减法的计算过程计算
思路
先判断被减数是否比减数小,是否输出“ - ”,然后倒叙存储进行计算,不够减的街尾,借位的需要-1
代码
1.先判断被减数是否比减数小并且倒叙存储
#include <iostream>
#include <cstring>
char a[1001], b[1001];
int inta[1001], intb[1001],ans[1001];
using namespace std;
int main()
{
cin >> a >> b;
int lena = strlen(a);
int lenb = strlen(b);
bool flag = 0;
if(lena < lenb)
{
flag = 1;
}
if(lena == lenb && strcmp(a, b) < 0)
{
flag = 1;
}
if(flag == 1)
{
cout << "-";
swap(a, b);
swap(lena, lenb);//如果被减数小于减数输出负号
}
for(int i = 0; i < lena; i++)
{
inta[i] = a[lena - i - 1] - '0';
}
for(int i = 0; i < lenb; i++)
{
intb[i] = b[lenb - i - 1] - '0';
}//倒叙存储
2.获取两个数中最长数的长度,也就是最后结果的长度,并且按照模拟算法计算
#include <iostream>
#include <cstring>
char a[1001], b[1001];
int inta[1001], intb[1001],ans[1001];
using namespace std;
int main()
{
cin >> a >> b;
int lena = strlen(a);
int lenb = strlen(b);
bool flag = 0;
if(lena < lenb)
{
flag = 1;
}
if(lena == lenb && strcmp(a, b) < 0)
{
flag = 1;
}
if(flag == 1)
{
cout << "-";
swap(a, b);
swap(lena, lenb);//交换位置
}
for(int i = 0; i < lena; i++)
{
inta[i] = a[lena - i - 1] - '0';
}
for(int i = 0; i < lenb; i++)
{
intb[i] = b[lenb - i - 1] - '0';
}
int len = max(lena, lenb);
for(int i = 0; i <= len; i++)
{
if(inta[i] < intb[i])//如果小,就要借位
{
inta[i] += 10;
intb[i + 1]--;//借位
}
ans[i] = inta[i] - intb[i];
}
3.去除前导零 如果我们的结果前面刚好减完是0,也就是0开头的,例如012345,我们要去掉这个零
#include <iostream>
#include <cstring>
char a[1001], b[1001];
int inta[1001], intb[1001],ans[1001];
using namespace std;
int main()
{
cin >> a >> b;
int lena = strlen(a);
int lenb = strlen(b);
bool flag = 0;
if(lena < lenb)
{
flag = 1;
}
if(lena == lenb && strcmp(a, b) < 0)
{
flag = 1;
}
if(flag == 1)
{
cout << "-";
swap(a, b);
swap(lena, lenb);
}
for(int i = 0; i < lena; i++)
{
inta[i] = a[lena - i - 1] - '0';
}
for(int i = 0; i < lenb; i++)
{
intb[i] = b[lenb - i - 1] - '0';
}
int len = max(lena, lenb);
for(int i = 0; i <= len; i++)
{
if(inta[i] < intb[i])
{
inta[i] += 10;
intb[i + 1]--;
}
ans[i] = inta[i] - intb[i];
}
while(ans[len] == 0 && len > 0)
{
len--;
}
4.输出。最后循环倒叙输出就好了
#include <iostream>
#include <cstring>
char a[1001], b[1001];
int inta[1001], intb[1001],ans[1001];
using namespace std;
int main()
{
cin >> a >> b;
int lena = strlen(a);
int lenb = strlen(b);
bool flag = 0;
if(lena < lenb)
{
flag = 1;
}
if(lena == lenb && strcmp(a, b) < 0)
{
flag = 1;
}
if(flag == 1)
{
cout << "-";
swap(a, b);
swap(lena, lenb);
}
for(int i = 0; i < lena; i++)
{
inta[i] = a[lena - i - 1] - '0';
}
for(int i = 0; i < lenb; i++)
{
intb[i] = b[lenb - i - 1] - '0';
}
int len = max(lena, lenb);
for(int i = 0; i <= len; i++)
{
if(inta[i] < intb[i])
{
inta[i] += 10;
intb[i + 1]--;
}
ans[i] = inta[i] - intb[i];
}
while(ans[len] == 0 && len > 0)
{
len--;
}
for(int i = len; i >= 0; i--)
{
cout << ans[i];
}
return 0;
}