马鞍山萤火虫书店在哪?:大数运算

来源:百度文库 编辑:偶看新闻 时间:2024/05/07 08:50:25
大数运算的思想就是用数组保存某个数字的各个数据位,
然后进行运算,并同样分割保存结果。

参考下面:
/*用数组存储数字,可以超越数据类型的限制,实现极大数的加法,减法和乘法   */
/*2005-3-7       梁见斌*/  

#include
#include
#include
#define   MAX   80

int   a[MAX]={0},   b[MAX]={0};
int   *r,   *s;
char   e[40],   f[40];/*   e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/  
char   *p,   *q;
     
void   NiZhi(int   *ShuZu,   int   len);/*把数字逆置,把个位数字存储在a[0]*/  
void   ZhuanHuan(char   *ZhiFu,   int   *ShuZi,   int   len);/*把字符改存为整型数字*/  
int   PanDuan(int   len);/*当len1=len2时判断a[]和   b[]谁大   */
void   JiaFa(int   len1,   int   len2);
void   JianFa(int   len1,   int   len2);
void   ChengFa(int   len1,   int   len2);

int   main(void)
{
      int   len1,   len2;
      int   choice;
     
      do{
              puts( "请您选择操作的方式: ");
                puts( "\t加法请按1   ");
                puts( "\t减法请按2   ");
                puts( "\t乘法请按3   ");
                scanf( "%d ",   &choice);
      }while(choice   <   1   ||   choice   > 3);    
     
      r=a;
      s=b;
      p=e;
      q=f;
      puts( "Inter   m: ");
      scanf( "%s ",   p);
      puts( "Inter   n: ");
      scanf( "%s ",   q);
     
      len1=strlen(e);
      len2=strlen(f);
      ZhuanHuan(p,   r,   len1);
      ZhuanHuan(q,   s,   len2);
     
      NiZhi(r,   len1);
      NiZhi(s,   len2);

            switch(choice)
            {
                  case   1:   JiaFa(len1,   len2);
                                  break;
              case   2:   JianFa(len1,   len2);
                                  break;                    
            case   3:   ChengFa(len1,   len2);
                                  break;
              default:   printf( "It 's   error ");                    
            }      
             
      system( "pause ");
      return   0;              
}      

void   NiZhi(int   *ShuZu,   int   len)
{
      int   i,   t;
      for(i=0;   i       {
            t=*(ShuZu+i);
            *(ShuZu+i)=*(ShuZu+len-i-1);
            *(ShuZu+len-i-1)=t;
      }  
}  

void   ZhuanHuan(char   *ZhiFu,   int   *ShuZi,   int   len)
{
      int   i;
      for(i=0;   i <=len-1;   i++)
              *(ShuZi+i)=int(*(ZhiFu+i))-48;          
}  

void   ChengFa(int   len1,   int   len2)
{
      int   i,   j,   k;
      int   c[MAX]={0},   aa[MAX]={0};/*a[max]和aa[max]存放被乘数,b[max]存放乘数,c[max]存放积*/  
      int   x,   jinwei,   d;
     
      for(i=0;   i <=len2;   i++)
      {
            for(j=0;   j <=len1;   j++)/*每次都使   aa[   ]表示被乘数*/
                    aa[j]=a[j];  
            d=20;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/  
            jinwei=0;/*c表示积的进位,初值为0*/  
         
            for(j=0;   j <=len1+d;   j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用aa[   ]存储当前积*/  
            {
                  x=aa[j]*b[i]+jinwei;
                  jinwei=x/10;
                  aa[j]=x%10;
            }    
            while(a[j]   ==   0)/*用j表示现有数字的个数,多出的存储空间应消除*/  
                    j--;
                   
            d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/  
            jinwei=0;/*c表示积的进位,初值为0*/  
            for(k=0;   k <=j+d;   k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/  
            {
                  x=aa[k]+c[k+i]+jinwei;
                  jinwei=x/10;
                  c[k+i]=x%10;
            }      
      }    
      k=k+i;   /*用k表示现有数字的个数,多出的存储空间应消除*/  
      while(c[k]   ==   0)
                    k--;
                   
      printf( "%s   *     %s   =\n ",   p,   q);
            for(i=k;   i> =0;   i--)
              printf( "%d ",c[i]);      
}

void   JiaFa(int   len1,   int   len2)
{
      int   i,   j;
      int   x,   jinwei,   max;
     
      max=(len1   > =   len2)?len1:len2;        
      jinwei=0;
      for(i=0;   i <=max+2;   i++)
      {
            x=a[i]+b[i]+jinwei;
            jinwei=x/10;
            a[i]=x%10;
      }    
      while(a[i]   ==   0)/*用j表示现有数字的个数,多出的存储空间应消除*/  
              i--;
      printf( "%s   +     %s   =\n ",   p,   q);
            for(j=i;   j> =0;   j--)
              printf( "%d ",a[j]);
}      

void   JianFa(int   len1,   int   len2)
{
      int   i,   j;
      int   max;
      int   flag=0;
               
      if(len1   ==   len2)/*当len1=len2时判断a[]和   b[]谁大   */
              flag=PanDuan(len1);
      if((len1   >   len2)   ||   (len1   ==   len2)   &&   flag)/*若m大于n直接按m-n计算*/  
      {
            for(i=0;   i             {
                  if(a[i]   > =   b[i])
                          a[i]=a[i]-b[i];
                  else
                  {
                        a[i+1]-=1;
                        a[i]=a[i]+10-b[i];
                  }      
            }    
            while(a[i]   ==   0)/*用j表示现有数字的个数,多出的存储空间应消除*/  
                    i--;
            printf( "%s   -   %s   =\n ",   p,   q);
                  for(j=i;   j> =0;   j--)
                    printf( "%d ",a[j]);
      }    
      else/*若m小于n,则按n-m计算,输出结果前面加负号*/  
            {
            for(i=0;   i             {
                  if(b[i]   > =   a[i])
                          b[i]=b[i]-a[i];
                  else
                  {
                        b[i+1]-=1;
                        b[i]=b[i]+10-a[i];
                  }      
            }    
            while(b[i]   ==   0)/*用j表示现有数字的个数,多出的存储空间应消除*/  
                    i--;
            printf( "%s   -   %s   =\n ",   p,   q);
            printf( "- ");
                  for(j=i;   j> =0;   j--)
                    printf( "%d ",b[j]);
      }    
}

int   PanDuan(   int   len)  
{
      int   i=len;
      while(a[i]   > =   b[i]   &&   i   > =   0)
              i--;
            if(i   > =   0)
                    return   0;
      else   if((i   <   0)   &&   (a[i+1]   ==   b[i+1]))
            {
                  printf( "\nThe   answer   is   0 ");
                  system( "pause ");
            exit(0);
      }      
      else
              return   1;  
} 六楼的这位人兄的答案太经典了,
如果我们用通用格式些,如:
void   add_multibyte(void   *a,void   *b,void   *c,char   len_a,char   len_b,char   len_c)
{
/*
    *a,数据a的起始地址;len_a,数据a的长度;
    *b,数据b的起始地址;len_b,数据b的长度;
    *c,数据c的起始地址;   len_c,数据c的长度;
    实现将     数据a+数据b   的值放到数据c的起始地址中。
    */
}

void   sub_multibyte(void   *a,void   *b,char   len_a,char   len_b)
{
/*
    *a,数据a的起始地址;len_a,数据a的长度;
    *b,数据b的起始地址;len_b,数据b的长度;

    实现将     数据a   -   数据b   的值放到数据a的起始地址中。
    */
}

void   mul_multibyte(void   *a,void   *b,void   *c,char   len_a,char   len_b,char   len_c)
{
/*
    *a,数据a的起始地址;len_a,数据a的长度;
    *b,数据b的起始地址;len_b,数据b的长度;
    *c,数据c的起始地址;   len_c,数据c的长度;
    实现将     数据a   *   数据b   的值放到数据c的起始地址中。
    */
}


void   sub_multibyte(void   *a,void   *b,char   len_a,char   len_b)
{
/*
    *a,数据a的起始地址;len_a,数据a的长度;
    *b,数据b的起始地址;len_b,数据b的长度;

    实现将     数据a   /   数据b   的值放到数据a的起始地址中。
    */
}

这样就可是实现外部的调用了