靈炁 2019-11-25 22:54 采纳率: 0%
浏览 468

c语言位运算,大佬们救救萌新吧

图片说明
定义函数unsigned mod(unsigned a, unsigned b, unsigned c); 功能是计算并返回a*b%c的结果。要求考试a, b, c的范围是大于0且小于 231,程序不能使用64位整型(如:long long类型或__int64)求解。
问题:a*b可能溢出(超出32位unsigned int型的表示范围)。为解决此问题,可用如下算法。
设unsigned型变量b的每个二进制位为xi (i=0,1, …, 31),i=0为最低位,i=31为最高位,则
, 所以

上式中,a*xi的结果或者为a或者为0;
2运算可用左移1位操作实现(小于231的整数*2结果一定小于232, 不会发生溢出);
%c的结果是小于c的,而c小于231,它与a求和也不会发生溢出。
编写完整程序,用迭代法实现上述算法。
要求测试b的每个二进制xi位为1或0的操作必须采用位运算实现。
输入提示:"Input unsigned integer numbers a, b, c:\n"
输入格式:"%u%u%u"
输出格式:"%u
%u%%%u=%u\n"
源程序代码:

  • 写回答

2条回答 默认 最新

  • qiangnanq 2020-10-26 11:59
    关注
    #include<stdio.h>
    unsigned mod(unsigned a, unsigned b, unsigned c)
    {
        unsigned sum=0;int i=0;
        while(b)
        {
            sum=sum+((a*(b&1))<<i)%c;//左移i位表示乘2的i次方 
            i++;
            b=b>>1;//相当于取余 
        }
        return sum;
    }
    int main()
    {
        unsigned a,b,c;
        printf("Input unsigned integer numbers a, b, c:\n");
        scanf("%u%u%u",&a,&b,&c);
        printf("%u*%u%%%u=%u\n",a,b,c,mod(a,b,c));
        return 0;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘