快速乘--c

题目:
问题 A: 快速乘
描述
a*b%p的值

格式
输入格式
输入a b p
a,b在long long的范围内

输出格式
a*b%p

样例
样例输入 Copy
2 4 3
样例输出 Copy
2

这一题是说a,b在long long 范围内,但结果不一定,所以不能用普通的乘,可以用快速乘,举个简单例子:12x11(1011)
1.122^31=96 (a=96)
2.122^20=0 (a=24,这一步在循环里应该是00000110&00000001,结果是零,所以不加上)
3.122^11=24 (a=24)
4.122^01=12 (a=12)
加起来跟普通乘法答案都是132

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
main()
{
    long long a,b,mod,res;
    while(scanf("%lld %lld %lld",&a,&b,&mod)!=EOF)
    {
        res=0;
        while(b)
        {
            if(b&1) res=(res+a)%mod; //1的二进制是00000001,而&运算时两个都是1才是1,比如11111110&00000001的结果就是0,而00001011&00000000就是1,那么这时就加个a,刚好对应二进制中的每一个1,下面的语句就是累加本身
            a=(a+a)%mod; //每算一次就加个本身,相当于一只增大,因为是二进制,比如1011,对应2^3,2^2,2^1,2^0,从后往前就是不断加个本身
            b/=2; //求二进制普遍用法
        }
        printf("%lld\n",res);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值