C语言实现高精度(大位数)减法

简介: C语言实现高精度(大位数)减法

1.位数的确定:假设c用来保存大数据a与大数据b的差,那么c的长度len = max(lena,lenb)

2.进位处理:

if(a[i] < b[i])
      { a[i+1]--; a[i] = a[i] + 10; }
      c[i] = a[i] - b[i];

3.判断数的大小

int compare(char s1[],char s2[]){
    if(strlen(s1)>strlen(s2))
        return 1;
    if(strlen(s1)<strlen(s2))
        return -1;
    for(int i=strlen(s1)-1;i>=0;i--){
        if(s1[i]>s2[i])
            return 1;
        if(s1[i]<s2[i])
            return -1;
}

源码

#include <stdio.h>
#include <string.h>
#define Max 3000
void gminus(char s1[],char s2[]);
void compare(char s1[],char s2[]);
int max(int a,int b);
int main()
{
    char s1[Max];
    char s2[Max];
    scanf("%s %s",s1,s2);
    gminus(s1,s2);
}
void gminus(char s1[],char s2[]){
    int flag;
    int a[Max];
    int b[Max];
    int c[Max]={0};
    int lena=strlen(s1);
    for(int i;i<lena;i++)
        a[i]=s1[lena-i-1]-'0';
    int lenb=strlen(s2);
    for(int i;i<lenb;i++)
        b[i]=s2[lenb-i-1]-'0';
    int len=max(lena,lenb);
    flag=compare(s1,s2);
    if(flag==0){
        putchar('0');
    }
    if(flag==1){
        for(int i=0;i<len;i++){
            if(a[i]<b[i]){
                a[i+1]--;
                a[i]+=10;
            }
            c[i]=a[i]-b[i];
        }
        while(c[len-1]==0)
            len--;
        for(int i=len-1;i>=0;i--){
            if(c[i]==0&&len>1)
                len--;
            else
                break;
        }
        for(int i=len-1;i>=0;i--)
            printf("%d",c[i]);
    }
    if(flag==-1){
        for(int i=0;i<len;i++){
            if(b[i]<a[i]){
                b[i+1]--;
                b[i]+=10;
            }
            c[i]=b[i]-a[i];
        }
        while(c[len-1]==0)
            len--;
        for(int i=len-1;i>=0;i--){
            if(c[i]==0&&len>1)
                len--;
            else
                break;
        }
        putchar('-');
        for(int i=len-1;i>=0;i--)
            printf("%d",c[i]);
    }
}
void compare(char s1[],char s2[]){
    if(strlen(s1)>strlen(s2))
        return 1;
    if(strlen(s1)<strlen(s2))
        return -1;
    for(int i=strlen(s1)-1;i>=0;i--){
        if(s1[i]>s2[i])
            return 1;
        if(s1[i]<s2[i])
            return -1;
}
    return 0;
}
int max(int a,int b){
    if(a>b)
        return a;
    else
        return b;
}

以上代码仅供参考


目录
相关文章
|
C语言
C语言之回文数的求解。回文数一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
C语言之回文数的求解。回文数一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
199 0
|
2月前
|
C语言
【C语言】三位数(1-4)不重复组合
【C语言】三位数(1-4)不重复组合
|
6月前
|
C语言
C语言学习记录——将三位数的个十百位单独打印,并求其和。
C语言学习记录——将三位数的个十百位单独打印,并求其和。
44 4
|
7月前
|
C语言
c语言编程练习题:7-28 求整数的位数及各位数字之和
c语言编程练习题:7-28 求整数的位数及各位数字之和
71 0
|
7月前
|
C语言
【C语言】如何只打印小数的有效数字位数且不补0
【C语言】如何只打印小数的有效数字位数且不补0
119 0
【C语言】如何只打印小数的有效数字位数且不补0
C语言十六弹 --求两个整数二进制位不同的位数
C语言十六弹 --求两个整数二进制位不同的位数
|
C语言
C语言每日一题 ---- 打印从1到最大的n位数(Day 1)
C语言每日一题 ---- 打印从1到最大的n位数(Day 1)
67 0
|
C语言
【C语言课程设计】二十以内加减法
【C语言课程设计】二十以内加减法
93 0
|
C语言
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
170 0
|
C语言
C语言实现高精度(大位数)阶乘
C语言实现高精度(大位数)阶乘
190 0