A*B mod C的计算方法

本文介绍了三种计算A*BmodC的有效方法。方法一通过直接计算A*B再求模;方法二利用二进制展开避免溢出;方法三采用递归方式结合位操作优化计算过程。适用于大数运算场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A*B mod C的计算方法

方法一:

大家都能想到,计算A*B的值,然后在计算A*B mod C的值。这是最简单的,但是这个有个弊端,即a*b的值不能太大,太大可能溢出。

方法二:

回顾进制转换的知识,二进制转换为10进制可以以2的权值相加(貌似是这样描述的)。比如13=(1101)2=1*2^3+1*2^2+0*2^1+1*2^0。同样的,当我们计算A*B的时候,也可以将B化成2^n相加的式子。于是,我们可以将a*b mod c转换成[a*(2^b0+2^b1+……2^bn)] mod c=[a*2^b0+a*2^b1+……a*2^bn] mod c。利用公式(a+b)mod c=[(a mod c)+(b mod c)]mod c这个公式进行运算。

代码:

int mul(int a,int b,int c)

{

      int result,tmp;

      tmp=a%c;

     while(b)

     {

           if(b&1)    //根据2相应二进制位的值判断是否加A*2^n;因为有对b进行右移运算,所以每次只需判断最末位的结果就可以。

          {

               result+=tmp;

               if(result>=c)

                  result-=c;

         }

         tmp<<=1; //计算 A*2^n的值。

         if(tmp>=c)

           tmp-=c;

      b>>=1;

   }

   return result;

}

方法三:

乘法可以这样算:a*b=(a&1)*b+[(a>>1)*b]<<1。同时,有公式:(a+b)mod c=[(a mod c)+(b mod c)]mod c

unsigned long long mul(unsigned long long a,unsigned long long b,unsigned long long c)
{
unsigned long long int a1=a,b1=b,c1=c;

if(!a1)
   return 0;
    return (((a1&1)*b1)%c1+(mul(a1>>1,b1,c1)<<1)%c1)%c1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值