蛄丶 2022-07-18 22:39 采纳率: 50%
浏览 25
已结题

c++数据暂存规则?

问题遇到的现象和发生背景

一段快速幂算法(题源来自洛谷第1226题)

问题相关代码,请勿粘贴截图
#include <bits/stdc++.h>
using namespace std;

int _power(int a, int b, int p) {
    a = a % p;
    long long ans = a;
    b--;
    while (b != 0) {
        if (b & 1) {ans = (ans * a) % p;} 
        b = b >> 1;
        **a = (a*a) % p;**
    }
    return ans % p;
}

int main() {
    int a, b, p;
    cin >> a >> b >> p;
    printf("%i^%i mod %i=%i",a,b,p,_power(a,b,p));
    return 0;
}

保证a,b均为0~2**31之间的整数,p在int范围内

运行结果及报错内容

当ab逼近上限时,答案恒为0

我的解答思路和尝试过的方法

0明显是由于数据越界引起的错误,将_power函数内的a定义为long long能保证正常输出。本人猜测可能是由于在a = (a*a) % p一步中,乘方数据暂存到a中(或者其他的内存处理规则)导致的越界引起错误。

我想要达到的结果

求解错误原因,并希望能获得关于多步计算中数据暂存的完整知识(给个链接文章也可

  • 写回答

1条回答 默认 最新

  • 浪客 2022-07-19 10:12
    关注

    那就再加个long long t;
    t = (long long)a * a;
    a = t % p;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月27日
  • 已采纳回答 7月19日
  • 创建了问题 7月18日

悬赏问题

  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题