大数的运算

大数加法

大数减法

大数乘法

大数除法

原理在代码的注释里。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Compare(char A[],char B[]) //编写函数比较两个大数大小。
 //A>B返回1,A=B返回0,A<B返回-1.
{
    int h1=strlen(A),h2=strlen(B);
    if(h1>h2) return 1;
    if(h1<h2) return -1;
    for(int i=0;i<=h1-1;){
        if(A[i]==B[i]) i++;
        else if(A[i]>B[i]) return 1;
             else return -1;
    }
    return 0;
}
void Add(char A[],char B[],char C[])//实现两个大数相加
{
    int h1=strlen(A),h2=strlen(B),k,l;
    char A1[100];//定义一个新的字符数组,存储A表示的大数。
    strcpy(A1,A);
    k=h1>h2?h1-1:h2-1;//记录最长的数的长度
    l=h1>h2?(h1-h2):(h2-h1);//记录两个数位数差
    int t2=h2-1; //记录B的位数,便于之后历数B的各个位
    if(Compare(A1,B)>=0){//如果A>=B执行下面语句
    for(;k>=l;k--){
        C[k]=(A1[k]-'0')+(B[t2]-'0')+'0';//按位相加
        t2--;
        if(C[k]>'9'){//考虑进位,如果超过九则减去10,把进的1加到A1表示的大数上,这样就不用存储进的1
            C[k]=C[k]-10;
            for(int i=k-1;i>=0;){
                if(A1[i]<'9'){
                    A1[i]++;
                    break;
                }
                A1[i]='0';
                i--;
            }
        }
    }
    if(l>0)//A的位数大于B  由上直接继承A的前几位
        for(;k>=0;k--)
            C[k]=A1[k];
    if(A1[0]=='0'||(l==0&&((A1[0]-'0'+B[0])>'9'))){//A的第一位等于零 说明C的第一位为10
        for(k=h1-1;k>=0;k--){//A的第一位不为零但是A[0]+B[0]>9 也说明C的第一位大于9
            C[k+1]=C[k];
        }
        C[0]='1';
    }

  }
else  Add(B,A,C);//以上是A>=B的情况A<B则递归调用自身
}

void Min(char A[],char B[],char C[])//大数减法
{
    int h1=strlen(A),h2=strlen(B),l,k,i;
    char A1[100];
    strcpy(A1,A);
    k=h1>h2?h1-1:h2-1;
    l=h1>h2?(h1-h2):(h2-h1);
     int t2=h2-1;
     if(Compare(A1,B)==0){//剔除A=B的情况
        C[0]='0';
        return;
     }
    if(Compare(A1,B)>0){//A>B执行下面语句
        for(;k>=l;k--){//各位依次相减
            C[k]=(A1[k]-'0')-(B[t2--]-'0')+'0';
            if(C[k]<'0') {//小于0借1 加10
                C[k]=C[k]+10;
                for(i=k-1;i>=0;){//循环,A[0]不可能为0
                    if(A1[i]!='0'){A1[i]--;break;}
                    A1[i]='9';
                    i--;
                }
            }
        }
        if(l>0)//A的位数大于B,C继承A的前几位
        for(;k>=0;k--)
            C[k]=A1[k];
        int cnt=0;//除去C前几位可能出现的0
        for(;cnt<=h1-1;cnt++){
            if(C[cnt]!='0')break;
        }
      for(i=0;cnt<=h1-1;){
            C[i++]=C[cnt++];
        }
        C[i]=0;
}
    else Min(B,A,C);//以上是A>=B的情况A<B则递归调用自身
}
void Mul(char A[],char B[],char C[])//大数乘法,遍历B的位数n,对B的各位*A*10^i求和。
{
    int h=strlen(B),i,t;
    for(i=h-1;i>=0;i--){
        for(t=B[i]-'0';t>=1;t--){
            Add(A,C,C);
        }
        strcat(A,"0");
    }

}
void Div(char A[],char B[],char C[])//大数除法
{
    char A1[100]={0},B1[100]={0};//避免修改原数,定义新的字符数组存储两个大数
    strcpy(A1,A);
    strcpy(B1,B);
    int cnt,k=0,i=0,h1=strlen(A)-1,h2=strlen(B)-1;
    if(Compare(A1,B1)<0){//剔除A小于B的情况
         C[0]='0';
         return;
    }
    if(Compare(A1,B1)==0){//剔除A=B的情况
         C[0]='1';
         return;
    }
    while(h1!=h2){//通过B*10^k使B的位数和A的位数一样,记录k,商总共k+1位
        B1[++h2]='0';
        k++;
    }
    while(i<=k){//商的个位求解完即结束循环
        for(cnt=0;Compare(A1,B1)>=0;){
            Min(A1,B1,A1);
            cnt++;
        }
        C[i++]=cnt+'0';
        B1[h2--]=0;
    }
    if(C[0]==0){//除去C前面可能出现的0。
        for(k=1;k<=h1;k++)
            C[k-1]=C[k];
    }

}
int main()
{
    char A[100]={0},B[100]={0},C[100]={0};
    scanf("%s",A);
    scanf("%s",B);
     Add(A,B,C);
   printf("A+B=");
     puts(C);
     printf("\n");
     strcpy(C,"\0");
      Min(A,B,C);
   printf("A-B=");
     puts(C);
     printf("\n");
     strcpy(C,"\0");
   Mul(A,B,C);
   printf("A*B=");
     puts(C);
     printf("\n");
     strcpy(C,"\0");
      Div(A,B,C);
   printf("A/B=");
     puts(C);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值