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
}
 
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值