C語言 大整數乘法,模擬人工計算

#include "string.h"// use for strlen function
#include "stdio.h"
#define  MAX 1000
#define  MaxResult 2000

void Calculate(char cArrA[],char cArrB[])
{
    
int iArrX[MAX]= {0};
    
int iArrY[MAX]= {0};
    
int iArrSum[MaxResult] = {0};

    
int lenX=0;//計算X長度
    int lenY=0;//計算Y長度

    printf(
"        %s ",cArrA);
    printf(
"       *%s ",cArrB);
    printf(
"------------------------------- ");

    lenX 
= (int)strlen(cArrA);
    lenY 
= (int)strlen(cArrB);

    
int i=0;
    
int len = lenX;
    
while (len-- > 0)
    
{
        iArrX[len] 
= (int)cArrA[i] - 48;//單個字符轉換爲數字的技巧,哈哈
        i++;
    }


    i 
= 0;
    len 
= lenY;
    
while (len-- > 0)
    
{
        iArrY[len] 
= (int)cArrB[i] - 48;
        i
++;
    }

    
int arrTemp[MAX+1= {0};//存放中間計算過程相乘所得數
    int flag= 0;//輸出最終結果時,判斷高位是否爲0;

    
for (int j=0;j<lenY;j++)
    
{
        
int temp=0;
        
int carry=0;//進位值,逢10進一
        int n = 0;//用於中間計算乘法結果位數,用於美化輸出中間乘法結果循環參數

        
//清除中間乘法數組數據
        for (int tep=0;tep<(lenX+lenY);tep++)
        
{
            arrTemp[tep] 
= 0;
        }

        
//計算中間乘法
        for (int k=0;k<lenX;k++)
        
{
            temp 
= iArrX[k]*iArrY[j]+carry;
            arrTemp[n
++= temp%10;
            
if (temp>=10)//原先計算結果不對是因爲寫成temp>10
            {
                carry
=temp/10;
            }

            
else
            
{
                carry 
= 0;//注意清零
            }

            
//注意別遺忘了進位值
            if (k==(lenX-1))
            
{
                
if (carry>0)
                
{
                    arrTemp[n
++= carry;
                }

            }

        }


        
//製作排列效果,使得更像人工計算方式

        
//最後一次中間乘法 打印一個“+”號
        if (j==(lenY-1))
        
{
            printf(
"+");
        }

        
//如果中間乘法中最高位乘法有進位,就少打一個空格,
        
//依據n-lenX來判斷,如果最高位沒有進位,那麼lenX等於n
        else
        
{
            
int rr = lenY-j+1+lenX-n;
            
while (rr-- > 0)
            
{
                printf(
" ");//打印空格
            }

        }

        

        
//輸出每次中間乘法的結果
        for (int m=n-1;m>=0;m--)
        
{
            printf(
"%d",arrTemp[m]);
        }


        
//累加每次計算的中間乘法結果
        carry = 0;//進位數初始化0
        for (int r=0;r<lenX+1;r++)
        
{
            temp 
= iArrSum[j+r] + arrTemp[r]+carry;
            iArrSum[j
+r] = temp%10;
            
if (temp>=10)//原先計算結果不對是因爲寫成temp>10
            {
                carry 
= temp/10;
            }

            
else
            
{
                carry 
= 0;//注意清零
            }

        }
  
        printf(
" ");
    }


    
//打印計算結果
    printf("------------------------------- ");
    
for (int i=(lenX+lenY);i>=0;i--)
    
{
    
if(iArrSum[i]!=0)
    
{
    flag 
=1;
    }

    
if ( flag == 1)
    
{
    printf(
"%d",iArrSum[i]);
    }

    }

    printf(
" ");

    
}

int _tmain(int argc, _TCHAR* argv[])

    
char cArrX[MAX];
    
char cArrY[MAX];
    printf(
"請輸入正整型數X:");
    scanf(
"%s",cArrX);
    printf(
" ");

    printf(
"請輸入正整型數Y:");
    scanf(
"%s",cArrY);
    printf(
" ");

    Calculate(cArrX,cArrY);
    
return 0
}
 
 
發佈了30 篇原創文章 · 獲贊 10 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章