您的位置:首页 > 其它

大数减法

2018-03-15 16:40 399 查看
之前更新了大数加法,减法相比较于加法,要注意的东西多了一些,拿a-b举例
比如:1.a和b的位数大小,如果a>b,那么直接减;如果a<b,就换成b-a,最后输出一个'-'
          2.如果a、b的位数相同,比较一下数的大小,道理同上。
          3.进位,一旦差出现负数,则向上借1,如果是0,继续借,直到借成,顺便把中间的0更新成9.(如果是100005,要把多出的1-1=0删去)

          4.输出依然要去0,比如1005-1002。
代码(这次代码很多,我也没有用很多实例去测试,如有问题,希望大家能及时指出)#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 10000;
char s1[maxn], s2[maxn];
int n1[maxn], n2[maxn], s[maxn];
int l1, l2, sign;//sign:0为初始,也是可以进行减法运算。1为减数为0,被减数不为0。2为减数不为0,被减数为0。3直接输出0;
void getn()//删除无意义的0,将大数倒置
{
int i,sg1 = l1, sg2 = l2;
bool flag = false;
for(i=0; i<l1; i++)
{
if(s1[i] != '0' && !flag)
{
flag = true;
break;
}
else if(s1[i] == '0' && !flag)
sg1--;
}
if(!flag)
sign = 1;
for(i=0; i<sg1; i++)
{
n1[i] = s1[l1-1-i]-48;
}
l1 = sg1;

flag=false;
for(i=0; i<l2; i++)
{
if(s2[i] != '0' && !flag)
{
flag = true;
break;
}
else if(s2[i] == '0' && !flag)
sg2--;
}
if(!flag)
{
if(sign == 1)
sign = 3;
else
sign = 2;
}
for(i=0; i<sg2; i++)
{
n2[i] = s2[l2-1-i]-48;
}
l2 = sg2;
}
void cuowei(int n)
{
if(n+1 == l1-1&& n1[n+1] == 1)
{
l1--;
}
if(n1[n+1] >0)
n1[n+1]--;
else
{
cuowei(n+1);
n1[n+1] = 9;
}
}
void ncuowei(int n)
{
if(n+1 == l2-1 && n2[n+1] == 1)
{
l2--;
}
if(n2[n+1] >0)
n2[n+1]--;
else
{
//cout << n+1 << endl;
ncuowei(n+1);
n2[n+1] = 9;
//cout << n+1 << endl;
}
}
int main()
{
int n,i,num;
cin >> n;//输入计算次数
while(n--)
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(n1,0,sizeof(n1));
memset(n2,0,sizeof(n2));
memset(s,0,sizeof(s));
sign = 0;
scanf("%s %s", &s1, &s2);
l1 = strlen(s1);
l2 = strlen(s2);
getn();
if(sign == 0)
{
int num = 0;
//两个数位数相同,需进一步判断
if(l1 == l2)
{
//看看减数和被减数谁大
for(i=l2-1; i>=0; i--)
{
if(n1[i]>n2[i])
{
sign = 1;
break;
}
else if(n1[i]<n2[i])
{
sign=2;
break;
}
else
continue;
}
//减数大
if(sign == 1)
{
for(i=0; i<l1; i++)
{
s[i] = n1[i] - n2[i];
if(s[i] <0 && i != l1-1)
{
cuowei(i);
s[i] = n1[i]+10-n2[i];
}
num++;
}
printf("%s - %s = ", s1, s2);
bool flag = false;
for(i=num-1; i>=0; i--)
{
if(s[i] != 0 && !flag)
flag = true;
else if(s[i] == 0 && !flag)
continue;
cout << s[i];
}
cout << endl;
}
//被减数大
else if(sign == 2)
{
for(i=0; i<l1; i++)
{
s[i] = n2[i] - n1[i];
if(s[i] <0)
{
ncuowei(i);
s[i] = n2[i]+10-n1[i];
}
num++;
}
printf("%s - %s = -", s1, s2);
bool flag = false;
for(i=num-1; i>=0; i--)
{
if(s[i] != 0 && !flag)
flag = true;
else if(s[i] == 0 && !flag)
continue;
cout << s[i];
}
cout << endl;
}
//一样
else
{
printf("%s - %s = 0", s1, s2);
cout << endl;
}
}
//差为正
else if(l1 > l2)
{
for(i=0; i<l2; i++)
{
s[i] = n1[i] - n2[i];
if(s[i] <0)
{
cuowei(i);
s[i] = n1[i]+10-n2[i];
}
num++;
}
while(i<l1)
{
s[i] = n1[i];
i++;
num++;
}
printf("%s - %s = ", s1, s2);
for(i=num-1; i>=0; i--)
{
cout << s[i];
}
cout << endl;
}
//差为负
else
{
for(i=0; i<l1; i++)
{
s[i] = n2[i] - n1[i];
if(s[i] <0)
{
ncuowei(i);
s[i] = n2[i]+10-n1[i];

}
num++;
}
while(i<l2)
{
s[i] = n2[i];
i++;
num++;
}
printf("%s - %s = -", s1, s2);
for(i=num-1; i>=0; i--)
{
cout << s[i];
}
cout << endl;
}
}
else if(sign == 1)
{
printf("%s - %s = -", s1, s2);
for(i=l2-1; i>=0; i--)
{
cout << n2[i];
}
cout << endl;
}
else if(sign == 2)
{
printf("%s - %s = ", s1, s2);
for(i=l1-1; i>=0; i--)
{
cout << n1[i];
}
cout << endl;
}
else if(sign == 3)
{
printf("%s - %s = ", s1, s2);
cout << '0' << endl;
}
if(n)
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数