求两大整数相乘

求两大
      对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算, 即所谓:“分块法”。
如下图:
 


上图则为基本算法。
源代码如下:

 
#include <stdio.h>
void  bigmul ( int  x ,  int  y ,  int  r [ ])
{
     int  base  =  10000 ;
     int  x2  =  x /  base ;
     int  x1  =  x  %  base ; 
     int  y2  =  y /  base ;
     int  y1  =  y  %  base ; 
    
     int  n1  =  x1  *  y1 ; 
     int  n2  =  x1  *  y2 ;
     int  n3  =  x2  *  y1 ;
     int  n4  =  x2  *  y2 ;
    
     r [ 3 ]  =  n1  %  base ;
     r [ 2 ]  =  n1 /  base  +  n2  %  base  +  n3  %  base ;
     r [ 1 ]  = n2/ base + n3/ base + n4 % base ; 
     r [ 0 ]  =  n4 /  base ;
    
     r [ 1 ]  +=  r [ 2 ]/ base ;  
     r [ 2 ]  =  r [ 2 ]  %  base ;
     r [ 0 ]  +=  r [ 1 ] /  base ;
     r [ 1 ]  =  r [ 1 ]  %  base ;
}
int  main ( int  argc ,  char *  argv [ ])
{
     int  x [ ]  =  { 0 , 0 , 0 , 0 } ;
    
     bigmul ( 87654321 ,  12345678 ,  x ) ;
    
     printf ( "%d%d%d%d\n" ,  x [ 0 ] , x [ 1 ] , x [ 2 ] , x [ 3 ]) ;
    
     return  0 ;
}
 
计算结果如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值