posts - 1,  comments - 0,  trackbacks - 0
#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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理