**IBOCE 第二天练习**
高精度减法
题目描述
高精度减法。
输入格式
两个整数 a,b(第二个可能比第一个大)。
输出格式
结果(是负数要输出负号)。
样例 #1
样例输入 #1
2
1
样例输出 #1
1
提示
- 20% 数据 a,b 在 long long 范围内;
- 100% 数据 0<a,b<=10^(10086)
/*微瑕.没有把二个数相等情况放进compare函数*/
#include<stdio.h>
#include<string.h>
char S1[10086],S2[10086],S3[10086]; //数的输入(用字符数组)
int a[10086],b[10086],c[10086]; //A-B=C
int compare (char S1[] ,char S2[]); //比较两数大小
void swap(char S1[] ,char S2[]); //两数交换
int main ()
{
int i,j,k,l,flag=0; //flag用来判断是否交换过 '1'为交换
int length_A,length_B,length_C; //数的长度
scanf("%s",S1); //高精度的数的输入
scanf("%s",S2);
flag=compare(S1,S2);
if(flag!=0)
swap(S1,S2);
length_A=strlen(S1);
length_B=strlen(S2);
for(i=0;i<length_A;i++) //个、十、百...对应数组下标1、2、3
a[length_A-i]=S1[i]-'0';
for(j=0;j<length_B;j++)
b[length_B-j]=S2[j]-'0';
length_C=length_A; //差'C'最大的长度
for(k=1;k<=length_C;k++)
{
if(a[k]<b[k])
{
a[k+1]--; //不够,向前借一
a[k]+=10;
}
c[k]=a[k]-b[k];
}
while(c[length_C]==0&&length_C>1) //删除前导'0'
length_C--;
if(strcmp(S1,S2)==0)
flag=0;
if(flag!=0) //不等于0说明交换过输出'-'
printf("-");
for(l=length_C;l>0;l--) //和'C'的输出
{
printf("%d",c[l]);
}
return 0;
}
int compare (char S1[] ,char S2[])
{
int i,flag,length_1,length_2;
length_1=strlen(S1);
length_2=strlen(S2);
if(length_1>length_2)
return flag=0;
if(length_1<length_2)
return flag=1;
if(length_1=length_2)
{
for(i=0;i<length_1;i++)
{
if(S1[i]!=S2[i]&&S1[i]>S2[i])
return flag=0;
if(S1[i]!=S2[i]&&S1[i]<S2[i])
return flag=1;
}
}
}
void swap(char S1[] ,char S2[])
{
char S3[10086];
strcpy(S3,S1);
strcpy(S1,S2);
strcpy(S2,S3);
}