大数加法的实现(不考虑负数)

来源:互联网 发布:java cyclicbarrier 编辑:程序博客网 时间:2024/05/01 12:13

实现思路:

1、先将两数倒序排列

2、从0到len-1位按位相加,和大于10设置进位标示;

3、处理两数位数相比多出的部分;

4、将结果以及原来两个加数倒序;

 

#include 《string.h〉
#include 〈stdlib.h》

#define MAX 100 //最大支持的位数

//倒序
void revnum(char *a)
{
   int len = strlen(a);
   char t;
   for(int i = 0; i< len/2; i++)
   {
       //i与j交换位置 i与len-i-1交换
       t = *(a+i);
        *(a+i) = *(a+(len-i-1));
        *(a+(len-i-1)) = t;
   }
}

//大数加法(不考虑负数)
char * bigAdd(char *a,char *b)
{
     revnum(a);
     revnum(b);
    int lena = strlen(a);
    int lenb = strlen(b);
    int lenc = lena;
    if(lenb > lenc)
    {
        lenc = lenb;
    }
    char * result = (char *)malloc(lenc+1);
    int t;
    int carry = 0;
    char *flagChar;
    char *flagresult;
    bool flag = false;
    for(int i = 0 ; i<lenc;i++)
    {  
        //t = (*a(i)) + (*b(i));// -'0'-'0' + carry;
        if ( a[i] == '/0' )
        {
            flag = true;
            flagChar = &b[i];
            flagresult = result+i;
            break;
        }
        if(b[i] == '/0')
        {
            flag = true;
            flagChar = &a[i];
            flagresult = result+i;
            break;
        }
         
        t = a[i] +b[i]-'0'-'0' + carry ;
        if( t > 9)
        { 
            itoa(t-10,result+i,10);
            carry= 1;           
        }
        else
        {
            itoa(t,result+i,10);
            carry =0;
        }
    }

    //两个加数长度不相同
    if(flag)
    {
        while(*(flagChar) != '/0')
        {
            t = flagChar[0] -'0' + carry ;
            if( t > 9)
            { 
                itoa(t-10,flagresult++,10);
                carry= 1;           
            }
            else
            {
                itoa(t,flagresult++,10);
                carry =0;
            }
            flagChar++;
        }
    }

    if ( carry != 0)
    {
       *(result+lenc) = '1';
       *(result+lenc+1) = '/0';
       }
    else
    {
       *(result+lenc) = '/0';
    }

    //printf("len:%d/n",lena);
    revnum(result);
    revnum(a);
    revnum(b);
    return result;
}

int main()
{
    char a[MAX];//= "321";
    char b[MAX];//= "26";
    while(1)
    {
        printf("分别输入两个加数/n");
        gets_s(a);
        gets_s(b);
        char *add = bigAdd(a,b);
        printf(" %s/n+%s/n-------/n %s/n",a,b,add);
        char t[2];
        printf("是否继续(y/n)(输入n退出)?/n");
        if(getchar() == 'n') break;
        //清空缓冲区
        flushall();
    }

}

原创粉丝点击