十进制大整数的减法运算
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;
}
(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;
}
相关文章推荐
- 整数高精度运算的库(加法,减法,乘法,除法,取模)
- 深入理解计算机系统(2.5)---二进制整数的加、减法运算(重要)
- 【大数算法】( 十进制整数四则运算) 十进制运算与二进制比较与思考
- 实现整数的乘法,减法和除法运算。只允许使用加号
- 大整数运算(加法,减法,除法,求余,求最大公约数)
- 大整数运算之 大整数加法、减法、乘法
- 9.7数学与概率(二)——实现整数的乘法、减法和除法运算,只允许使用加号
- 大精度整数三种运算(加法,减法,乘法)
- 大整数运算之 大整数加法、减法、乘法
- 算法(求对输入的N个数进行加法或减法运算,得到最小的正整数的组合.)
- 编写一个程序,实现两个256位的十进制整数的乘法运算.
- 大型整数运算:加法, 减法, 乘法
- 长整数相加运算(内含减法)。。= =
- 程序员面试金典: 9.7位操作 7.4只用加号实现整数的乘法、减法和除法运算
- 用分治算法编程实现两个n位十进制大整数的乘法运算
- 深入理解计算机系统(2.5)---二进制整数的加、减法运算(重要)
- 大整数运算模板(减法)
- 实现整数的乘法、减法和除法运算,只允许使用加号
- 大整数运算模板(减法)
- 大整数运算库gmp安装及使用