CC

自然万物都趋向从有序变得无序

0%

高精度减法

Description

输入两个整数a和b,输出这两个整数的差。a和b都不超过100位。

Input

输入包括两行,第一行为一个非负整数a(被减数),第二行为一个非负整数b(减数)。两个整数都不超过100位,两数的最高位都不是0。

Output

输出一行,表示a - b的值。

Sample Input

99999999999999999999
99999999
123
321

Sample Output

99999999999900000000
-198

思路:

    高精度减法,利用数组模拟减的过程,不过最开始应该判断数的大小,如果第一个数比第二个数小则要输出减号并交换两个数,否则就不变.
    减法存在一个向上一位借数的过程,就是当前两个数的被减数比减数小时就向前借一位.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<string.h>
#include<stdio.h>
int main()
{
int a[110],b[110],c[110];
char s1[110],s2[100],t[110];
int i,j;
int lena,lenb,lenc;
while(scanf("%s %s",s1,s2)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
if(strlen(s1)<strlen(s2)||(strlen(s1)==strlen(s2)&&strcmp(s1,s2)<0))//比较两个数的大小,如果被减数比减数小就交换位置并输出减号
{
strcpy(t,s1);
strcpy(s1,s2);
strcpy(s2,t);
printf("-");
}
lena=strlen(s1);
lenb=strlen(s2);
for(i=0,j=lena-1;i<lena;i++,j--)//逆序储存两个数
a[j]=(int) (s1[i]-'0');
for( i=0,j=lenb-1;i<lenb;i++,j--)
b[j]=(int) (s2[i]-'0');
i=0;
while(i<lena||i<lenb)
{
if(a[i]<b[i])//借位的过程
{
a[i+1]--;
a[i]+=10;;
}
c[i]=a[i]-b[i];
i++;
}
lenc=i;
for(;c[lenc]==0&&lenc>0;lenc--);//清除前导0
for(i=lenc;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}