#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;
}