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