C语言学习笔记(五)----高精度的加减法

前几天搞了个高精度的加法,今天就搞了个高精度的减法。感觉有点难,所以只是拓展了减法,运算比较粗糙,各种判断方法也比较暴力。

高精度加减法的C语言实现(正整数)

#include<stdio.h>
int num1[100]={0};//数据1
int num2[100]={0};//数据2
char cnum[100]={0};//临时储存数据
int ans[100]={0};//结果
int m,n,t,i,j;//各种标记变量和计数器
void Add(){
    for(;n>=1;n--){   //进行加法运算
        if(i&&j) ans[n]=num1[i--]+num2[j--]+ans[n];//防止下标越界
        else if(i)ans[n]=num1[i--]+ans[n];
        else if(j)ans[n]=num2[j--]+ans[n];
        if(ans[n]>=10){   //进位处理
            ans[n]-=10;
            ans[n-1]++;
        }
    }
}

void Sub(int p){       //减法运算
    if(p==0)
        for(;n>=1;n--){
            if(i>=0&&j>=0) ans[n]=num1[i--]-num2[j--]+ans[n];//防止下标越界
            else if(i>=0) ans[n]=num1[i--]+ans[n];
            if(ans[n]<0){    //借位运算
                ans[n]+=10;
                ans[n-1]--;
        }
    }
    if(p==1){
        for(;n>=1;n--){
            if(i>=0&&j>=0) ans[n]=num2[j--]-num1[i--]+ans[n];//防止下标越界
            else if(j>=0) ans[n]+=num2[j--];
            if(ans[n]<0){     //借位运算
                ans[n]+=10;
                ans[n-1]--;
            }
        }
    }
}

int bigger(){      //比较两数据大小
    for(int w=1;w<=i;w++){
        if(num1[w]>num2[w]) return 0;
        if(num1[w]<num2[w]) return 1;
    }
    return 0;
}

int main(){
    printf("这是一个加减法运算程序,您需要输入所要运算的式子,运算符前后请不要加空格,请按回车键结束输入。\n");
    printf("Ps.本程序暂时不支持负数运算。\n");
    t=0;
    i=1;j=1;
    int p=0;
    while(1){       //读取第一个数据
        scanf("%c",&cnum[i]);
        if(cnum[i]=='-'){  //判断数据结束并记录进行加法运算
            i--;
            t=1;
            break;
        }
        if(cnum[i]=='+'){  //判断数据结束并记录进行减法运算
            i--;
            t=0;
            break;
        }
        num1[i]=cnum[i]-48;//转化为数字存储
        i++;
    }
    while(1){//读取第二个数据
        scanf("%c",&cnum[j]);
        if(cnum[j]=='\n'){//判断数据结束
            j--;
            break;
        }
        num2[j]=cnum[j]-48;//转化为数字存储
        j++;
    }
    if(i>j) n=i;//判断结果长度,比较两数据大小并标记,保证进行减法时始终以大数减小数
    else if(i==j){
        p=bigger();
        if(bigger()) n=j;
    }
    else if(j>i){
        n=j;p=1;
    }
    m=n;//备份结果长度
    if(t==0) Add();//进行加法运算
    else Sub(p);//进行减法运算
    i=0;
    while(ans[i]==0){//略过开头的0
        i++;
    }
    if(p&&t) printf("-");//输出符号
    for(;i<=m;i++)     //输出结果
        printf("%d",ans[i]);
    return 0;
}

高精度减法和加法还是有很区别的,如果用小数来减大数,借位处理时就会很麻烦。仅仅是把加号改成减号运算就不太合适,所以我写了一个函数bigger(),用来判断哪个数据更大,并且引入了一个变量p,来储存这个判断结果。 当数据2更大些时,输出减法运算结果之前先输出‘-‘。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值