您的位置:首页 > 其它

十进制大整数的减法运算

2017-08-30 22:19 316 查看
注意点:

(1)减法的特性:借位。

(2)可能会出现连续借位的情况。

(3)借位前有可能被借位是0。

(4)有可能结果是负数。

(5)注意考虑前面都是0的情况。

代码:#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 5000001
int a[maxn],b[maxn],cha[maxn+1];

void opera()
{
memset(a, 0, sizeof(a));
memset(cha, 0, sizeof(cha));
char ch;
while(ch = getchar(), ch != ' ')
{
cha[0] ++;
cha[cha[0]] = ch - '0';
}
a[0] = cha[0];
for(int i = 1; i <= cha[0]; i++)
a[i] = cha[cha[0] + 1 - i];
memset(b, 0, sizeof(b));
memset(cha, 0, sizeof(cha));
while(ch = getchar(), ch != '\n')
{
cha[0]++;
cha[cha[0]] = ch - '0';
}
b[0] = cha[0];
for(int i = 1; i <= cha[0]; i++)
b[i] = cha[cha[0] + 1 - i];
}

void judge()
{
bool flag = false;
if(a[0] < b[0])
flag = true;
if(a[0] == b[0])
{
for(int i = a[0]; i >= 1; i--)
{
if(a[i] > b[i])
{
flag = false;
break;
}
if(a[i] < b[i])
{
flag = true;
break;
}
}
}
if(flag)
{
memset(cha, 0, sizeof(cha));
for(int i = 0; i <= a[0]; i++)
cha[i] = a[i];
memset(a, 0, sizeof(a));
for(int i = 0; i <= b[0]; i++)
a[i] = b[i];
memset(b, 0, sizeof(b));
for(int i = 0; i <= cha[0]; i++)
b[i] = cha[i];
}
if(flag)
printf("-");
}

void minu()
{
memset(cha, 0, sizeof(cha));
cha[0] = a[0];
for(int i = 1; i <= cha[0]; i++)
{
if(a[i] < b[i])
{
a[i] += 10;
a[i+1]--;
}
cha[i] = a[i] - b[i];
}
}

void printout()
{
while(cha[0] > 1 && cha[cha[0]] == 0)
cha[0] --;
for(int i = cha[0]; i >= 1; i--)
printf("%d", cha[i]);
printf("\n");
}

int main(){
int n;
scanf("%d", &n);
getchar();
for(int i = 1; i <= n; i++)
{
opera();
judge();
minu();
printout();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 经验 大数处理