大數計算機

來源:互聯網
上載者:User
#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;#define MAX_DIGIT 500//大數運算:加法int Multiply(int *a,int *b,int *&result);//大數運算:乘法int Add(int *a,int *b,int *&result);//大數運算:減法int Sub(int *a,int *b,int *&result);//逐位調整大數,如result為11 9 22 -3 -2調整為:1 0 3 9 -3,然後再對符號提升到最高位: 9 9 6 0 2... ... -1//表示大數的值為-20699void AjustEncodeArray(int *&result,unsigned int iMaxNum);//輸出大數void PrintBigNum(int *result);//把個位在高位的字元數組轉為個位在低位(下標0)的整型數組void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum);//大數運算:加法int Add(int *a,int *b,int *&result){    if(a==NULL || b==NULL || result==NULL)    {        printf("multiply:input error/n");        return -1;    }    int i=0,j=0;    //初始化result數組    for(i=0;i<MAX_DIGIT*2;++i)    {    result[i]=0;    }    for(i=0;i<MAX_DIGIT;++i)    {        result[i] += (a[i]+b[i]);    }    AjustEncodeArray(result,MAX_DIGIT*2);    return 0;}//大數運算:減法int Sub(int *a,int *b,int *&result){    if(a==NULL || b==NULL || result==NULL)    {        printf("multiply:input error/n");        return -1;    }    int i=0,j=0;    //初始化result數組    for(i=0;i<MAX_DIGIT*2;++i)    {    result[i]=0;    }    for(i=0;i<MAX_DIGIT;++i)    {        result[i] += (a[i]-b[i]);             //result裡可以為負數    }    AjustEncodeArray(result,MAX_DIGIT*2);    return 0;}//大數乘法int Multiply(int *a,int *b,int *&result){    if(a==NULL || b==NULL || result==NULL)    {        printf("multiply:input error/n");        return -1;    }    int i=0,j=0;    //初始化result數組    for(i=0;i<MAX_DIGIT*2;++i)    {    result[i]=0;    }    //a[0]為個位起算,結果的位移位為i+j,    //如個位*十位,則運算結果的位移為0+1即1    //例子:a[0]為9,b[1]為7,則result[1]加63    for(i=0;i<MAX_DIGIT;++i)    {        for(j=0;j<MAX_DIGIT;++j)        {            result[i+j] += a[i]*b[j];        }    }    AjustEncodeArray(result,MAX_DIGIT*2);    return 0;}//逐位調整大數,如result為11 9 22 -3 -2調整為:1 0 3 9 -3,然後再對符號提升到最高位: 9 9 6 0 2... ... -1//表示大數的值為-20699void AjustEncodeArray(int *&result,unsigned int iMaxNum){    int i = 0;    unsigned int iNumFlag = 0;    unsigned int iWeight = 0;            //有效最高位的權值    //遍曆找出有效資料的最高位的下標(正負都有可能)    for(i=iMaxNum-1;i>=0;--i)    {         if(result[i]!=0)        {            iNumFlag=i;            break;        }    }    //從低位開始往上調整,規則:大於10的正數要進位,負數要借位    for(i=0;i<iNumFlag;++i)    {        //進位        if(result[i]>0)        {            result[i+1] += result[i]/10;        //十位以上都要進位            result[i] = result[i]%10;           //調整進位後的當前位        }        else if(result[i]<0)        {            result[i+1] -= 1;        //忽略高位是否可借位,強行借位            result[i] = 10+result[i];        }    }    //若有效最高位為負數,需要對負號進行提升,就是對高位與餘下低位進行一次減法    if(result[iNumFlag]<0)    {        iWeight = -result[iNumFlag];        int iMinuend[2*MAX_DIGIT]={0};        iMinuend[iNumFlag] = iWeight;          //被減數        result[iNumFlag] = 0;               //構造減數        for(i=0;i<iNumFlag+1;++i)        {            result[i] = (iMinuend[i]-result[i]);        }        //調整借位        for(i=0;i<iNumFlag;++i)        {            if(result[i]<0)            {                result[i+1] -= 1;                result[i] = 10+result[i];            }        }        result[iMaxNum-1] = -1;    }}void PrintBigNum(int *result){    int index = MAX_DIGIT*2-1;    bool bNegative = false;    //從最高位找到第一個不為負的位,從此位開始為有效值    while(result[index]<=0)    {    if(result[index]<0)    {        bNegative = true;    }    index--;    }    if(bNegative)    {        printf("-");    }    for(int i=index;i>=0;--i)    {    printf("%d",result[i]);    }    printf("/n");}void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum){    int i = 0;    unsigned int iLen = strlen(cArray);    //初始化DigitArray    for(i=0; i<iNum; ++i)    {    DigitArray[i] = 0;    }    for(i=0; i<iLen; ++i)    {    DigitArray[iLen-1-i] = cArray[i]-'0';    }}int main(){    int a[MAX_DIGIT],b[MAX_DIGIT],resultArray[2*MAX_DIGIT];    char cArray1[MAX_DIGIT],cArray2[MAX_DIGIT];    int ret = 0;    int *result = (int *)resultArray;    printf("Input multiplier:/n");    scanf("%s",cArray1);    printf("Input multiplicand:/n");    scanf("%s",cArray2);    CArray2revDigitArray(cArray1,a,MAX_DIGIT);    CArray2revDigitArray(cArray2,b,MAX_DIGIT);    ret=Multiply(a,b,result);    if(ret!=0)    {    printf("Multiply error,ret:%d/n",ret);    return -1;    }    PrintBigNum(result);    ret=Add(a,b,result);    if(ret!=0)    {    printf("Multiply error,ret:%d/n",ret);    return -1;    }    PrintBigNum(result);    ret=Sub(a,b,result);    if(ret!=0)    {    printf("Multiply error,ret:%d/n",ret);    return -1;    }    PrintBigNum(result);    return 0;}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.