概要
其实该方法和高精度加法异曲同工,核心方法都是一样的
1、将数字以字符串形式存入char数组;
2、若A<B,将A、B位置调换,在前方先输出一个负号
3、将数组中元素倒序存入另一个char数组,即将位数小的数放在数组中序号小的,位数大的放序号大的;
4、将每一个char型字符转变成int数字,如'5'-'0'=5,这样就把char数字变成int数字;
5、每一位之间进行减法运算,注意借位减一;
6、输出时注意最高位是否有0,有0不要输出;
步骤2
若A<B,将A、B位置调换,在前方先输出一个负号
if ((len1<len2)||((len1==len2)&&(strcmp(s1,s2)<0))){
printf("-");
strcpy(temp,s1);
strcpy(s1,s2);
strcpy(s2,temp);
len1=strlen(s1);
len2=strlen(s2);
}
步骤3、4
将数组中元素倒序存入另一个char数组
将每一个char型字符转变成int数字
for (i=len1-1;i>=0;i--){
a[len1-1-i]=s1[i]-'0';
}
for (i=len2-1;i>=0;i--){
b[len2-1-i]=s2[i]-'0';
}
步骤5
每一位之间进行减法运算
for (i=0;i<len1;i++){
if (c[i]+a[i]-b[i]<0){
a[i+1]=a[i+1]-1;
c[i]=10+a[i]-b[i];
}
else c[i]=c[i]+a[i]-b[i];
}
步骤6
输出
for (k=i-1;k>0;k--){
if (c[k]!=0) break;
}
for (;k>=0;k--){
printf("%d",c[k]);
}
完整代码
#include<stdio.h>
#include<string.h>
char s1[10007],s2[10007],temp[10007];
int a[10007],b[10007],c[10007];
int main(){
scanf("%s",s1);
scanf("%s",s2);
int len1=strlen(s1),len2=strlen(s2);
if ((len1<len2)||((len1==len2)&&(strcmp(s1,s2)<0))){
printf("-");
strcpy(temp,s1);
strcpy(s1,s2);
strcpy(s2,temp);
len1=strlen(s1);
len2=strlen(s2);
}
int i,j,k,m,n;
for (i=len1-1;i>=0;i--){
a[len1-1-i]=s1[i]-'0';
}
for (i=len2-1;i>=0;i--){
b[len2-1-i]=s2[i]-'0';
}
for (i=0;i<len1;i++){
if (c[i]+a[i]-b[i]<0){
a[i+1]=a[i+1]-1;
c[i]=10+a[i]-b[i];
}
else c[i]=c[i]+a[i]-b[i];
}
for (k=i-1;k>0;k--){
if (c[k]!=0) break;
}
for (;k>=0;k--){
printf("%d",c[k]);
}
return 0;
}