C语言大整数想乘之模拟人工计算

C语言大整数想乘之模拟人工计算
#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 ;

你可能感兴趣的:(C语言大整数想乘之模拟人工计算)