#include "string.h"// use for strlen function
#include "stdio.h"
#include "stdlib.h"
#define MAX 1000//设定输入的最长整数
typedef unsigned char byte;
void Calculate(char cArrA[],char cArrB[])
{
int iArrX[MAX]= {0};
int iArrY[MAX]= {0};
int lenX=0;//计算X长度
int lenY=0;//计算Y长度
printf(" %s\n",cArrA);
printf(" *%s\n",cArrB);
printf("-------------------------------\n");
lenX = (int)strlen(cArrA);
lenY = (int)strlen(cArrB);
byte *iArrSum;//存储计算结构的指针
iArrSum = (byte *)malloc(lenX+lenY+1);//动态分配存储空间
memset(iArrSum,0,lenX+lenY+1);//初始化0值
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)
carry = temp/10;
else
carry = 0;//注意清零
}
printf("\n");
}
//打印计算结果
printf("-------------------------------\n");
for (int i=(lenX+lenY);i>=0;i--)
{
if(*(iArrSum+i)!=0)
flag =1;
if ( flag == 1)
printf("%d",*(iArrSum+i));
}
printf("\n");
free(iArrSum);//释放内存
}
int _tmain(int argc, _TCHAR* argv[])
{
char cArrX[MAX];
char cArrY[MAX];
printf("请输入正整型数X:");
scanf("%s",cArrX);
printf("\n");
printf("请输入正整型数Y:");
scanf("%s",cArrY);
printf("\n");
Calculate(cArrX,cArrY);
return 0;
}
posted on 2008-04-25 15:28
dennis 阅读(221)
评论(0) 编辑 收藏 引用