高精度减法 problem A-B

概要

其实该方法和高精度加法异曲同工,核心方法都是一样的

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;
}
上一篇:“蓝桥杯”练习系统 - 入门训练 - Fibonacci数列


下一篇:Fibonacci数列