C语言数组运用——大数的加减

虽然代码写得繁杂了点,但是至少能用。支持包含小数点的大数加减。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void add(int num1[50],int num2[50],int i,int j,int a,int b){//加法函数 
    int change=0;//change用于记录进位 ,如果有进位,change会变为1。 
    int q,n;
    int re[60];//用于存放两个大数相加后的值
    i=i+a;//忽略小数点,将补位后的小数部分一并算作大数的一部分,i就是这个大数的总位数。 
    j=j+b;
    for(n=0;i!=0&&j!=0;n++){
        re[n]=num1[i-1]+num2[j-1]+change;//从末尾开始相加 
        if(i-1==0&&j-1==0)break;//当两个数位数相同时,为了防止有进位后下面步骤会只取到个位,故直接退出 
        if(re[n]>9){
            re[n]=re[n]%10;//有进位的话只取个位 
            change=1;//进位标识值变为1 
        }
        else change=0;//无进位时,标识值变为0 
        i--;
        j--;
        
    }
    if(i==0&&j==0){
        //由于在前面对开头已经处理好,所以这里不作处理 
    }
    
    else if(i==0){//对于位数不相等时进位的操作 
        while(j!=0){
            re[n]=num2[j-1]+change;
            if(j-1==0)break;//用意与之前的代码相同 
            if(re[n]>9){
                re[n]=re[n]%10;
                change=1;
            }
            else change=0;
                j--;
                n++;
        }
    }
    else if(j==0){
        while(i!=0){
            re[n]=num1[i-1]+change;
            if(i-1==0)break;
            if(re[n]>9){
                re[n]=re[n]%10;
                change=1;
            }
            else change=0;
            i--;
            n++;
        }
    }
    
    for(q=n;q>=0;q--){//输出re[]中存的值 
        if(q==a-1)printf(".");//没有忘记小数点 
        printf("%d",re[q]);
    }
    
}
/************************************************************************/

//减法 
void sub(int num1[50],int num2[50],int i,int j,int a,int b){
    int change=0;//进位 
    int q,n;
    i=i+a;//忽略小数点,将补位后的小数部分一并算作大数的一部分,i就是这个大数的总位数。 
    j=j+b;
    int re[60];
    if(i>j){//被减数大于减数时 
    for(n=0;i!=0&&j!=0;n++){
        re[n]=num1[i-1]-change-num2[j-1];
        if(re[n]<0){
            re[n]=re[n]+10;
            change=1;
        }
        else change=0;
        i--;
        j--;
    }
    if(j==0){//对于位数不相等时进位的操作 (好像有点多余) 
        while(i!=0){
            re[n]=num1[i-1]-change;
            if(i-1==0)break;
            if(re[n]<0){
                re[n]=re[n]+10;
                change=1;
            }
            else change=0;
            i--;
            n++;
        }
    }
    for(q=n;q>=0;q--){
        if(q==a-1)printf(".");
        printf("%d",re[q]);
    }        
    }
    
    else if(i<j){//被减数位数小于减数时
    for(n=0;i!=0&&j!=0;n++){
        re[n]=num2[j-1]-change-num1[i-1];
        if(re[n]<0){
            re[n]=re[n]+10;
            change=1;
        }
        else change=0;
        i--;
        j--;
    }
    if(i==0){//对于位数不相等时进位的操作 
        while(j!=0){
            re[n]=num2[j-1]-change;
            if(j-1==0)break;
            if(re[n]<0){
                re[n]=re[n]+10;
                change=1;
            }
            else change=0;
            j--;
            n++;
        }
    }
    printf("-");
    for(q=n;q>=0;q--){
        if(q==a-1)printf(".");
        printf("%d",re[q]);
    }
    
        
    }
    else if(i==j){
        int k=1;//k用于标识两个数的大小 (赋初值不影响结果,但必须赋个初值,不然两个数相同时会出错)
        for(n=0;n<i;n++){
            if(num1[n]>num2[n]){//第一个数大于第二个数 
                k=1;
                break;
            }
            else if(num1[n]<num2[n]){//第一个数小于第二个数 
                k=2;
                break;
            }
            else continue;
        }
        if(k==2){
            for(n=0;i!=0&&j!=0;n++){
            re[n]=num2[j-1]-change-num1[i-1];
            if(j-1==0)break;
            if(re[n]<0){
                re[n]=re[n]+10;
                change=1;
            }
            else change=0;
            i--;
            j--;
            }
            printf("-");
            for(q=n;q>=0;q--){
            if(q==a-1)printf(".");
            printf("%d",re[q]);
        }
        }
        else if(k==1){
            for(n=0;i!=0&&j!=0;n++){
            re[n]=num1[i-1]-change-num2[j-1];
            if(i-1==0)break;
            if(re[n]<0){
                re[n]=re[n]+10;
                change=1;
            }
            else change=0;
            i--;
            j--;
            }
            for(q=n;q>=0;q--){
            if(q==a-1)printf(".");
            printf("%d",re[q]);
        }
            
        }    
        
    }
    
    
}//使用减法函数时最后往往会有很多0出现,这个。。。不知道怎么去掉 

/**************************************************************************************/
int main()
{
    int num1[50],num2[50],re[60];
    int i=0,j=0,a=0,b=0,n,q;
    char temp;//一个临时的存储变量 
    printf("请输入第一个大数:"); 
    scanf("%c",&temp);
    for(i=0;temp!='.'&&temp!='\n';i++){//num1[]数组存储第一个大数 
        num1[i]=(int)temp-48;//通过强制转换把字符型输入变为整型。 
        scanf("%c",&temp);
    }
    if(temp=='.'){//如果输入了小数点,数组存储小数点后面的数字,用a记录下小数点的位数 
        scanf("%c",&temp);
        for(a=0;temp!='\n';a++){
            num1[i+a]=(int)temp-48;
            scanf("%c",&temp);
        }
    }
    
    printf("请输入第二个大数:"); 
    scanf("%c",&temp);
    for(j=0;temp!='.'&&temp!='\n';j++){//存储第二个大数 
        num2[j]=(int)temp-48;
        scanf("%c",&temp);
    }
    if(temp=='.'){//存储小数点后面的数字 
        scanf("%c",&temp);
        for(b=0;temp!='\n';b++){
            num2[j+b]=(int)temp-48;
            scanf("%c",&temp);
        }
    }
    
    if(a<b){//小数点后补位,使两者的小数点位数相同,方便加减 
        for(q=a+i;q-i<b;q++){
            num1[q]=0;
        }
        a=b;//更新位数 
    }
    else if(b<a){
        for(q=b+j;q-j<a;q++){
            num2[q]=0;
        }    
        b=a;
    }
    //将补位后的数组连同小数点后的数字看成一个整体 
    
    int n1[50],n2[50];//存储大数的绝对值 
    if(num1[0]==-3&&num2[0]==-3){//当两个数都是负数时,负号的整型值为-3 
        for(q=0;q<i+a;q++){
            n1[q]=num1[q+1];//将输入时的负号忽略,剩下的数按顺序录入一个新数组 
        }
        for(q=0;q<j+b;q++){
            n2[q]=num2[q+1];
        }
        printf("两个数相加为:");
        printf("-");
        add(n1,n2,i-1,j-1,a,b);
        printf("\n");
        printf("两个数相减为:");
        sub(num2,num1,j,i,a,b);
    }
    else if(num1[0]==-3){//当第一个数是负号 
        for(q=0;q<i+a;q++){
            n1[q]=num1[q+1];
        }
        printf("两个数相加为:");
        sub(num2,n1,j,i-1,a,b);
        printf("\n");
        printf("两个数相减为:");
        printf("-");
        add(n1,num2,i-1,j,a,b);
    }
    else if(num2[0]==-3){//当第二个数是负号 
        for(q=0;q<j+b;q++){
            n2[q]=num2[q+1];
        }
        printf("两个数相加为:");
        sub(num1,n2,i,j-1,a,b);
        printf("\n");
        printf("两个数相减为:");
        add(num1,n2,i,j-1,a,b);
    }
    else{//都是正数时 
        printf("两个数相加为:");
        add(num1,num2,i,j,a,b);
        printf("\n");
        printf("两个数相减为:");
        sub(num1,num2,i,j,a,b);
        
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wabulabudabuda/p/13191861.html