C for循环几乎正确

标签 c for-loop uint64 uint32

我正在处理一个家庭作业问题,涉及将问题的递归解决方案与其对应的迭代解决方案进行比较。目前我有适用于给定值集的递归函数,但是迭代版本似乎适用于除最后一个值之外的每个值,这对我来说似乎很奇怪。

迭代函数如下

uint64_t
normalPower(uint64_t k, uint64_t n, uint32_t m)
{
    uint64_t answer = 1;
    for (int i = 1; i <= n; i++)
    {
    answer = answer * k % m;
    }
    return answer;
    return EXIT_SUCCESS;

}

与其他相关信息一起

uint64_t n;
for (int i = 0; i <= 10; i++)
{
    n = n * 10;
}

uint64_t k = 1835;
uint32_t m = 590623782;

当我运行递归函数时,我得到的最终值的答案是 424171147,这是我与其他同学确认的。我只是对为什么该算法适用于所有先前的值而不适用于最终值感到困惑。非常感谢任何帮助。

旁注:我知道迭代版本效率极低,这就是作业的重点。

这里要求的是递归函数

uint64_t
fastPower(uint64_t k, uint64_t n, uint32_t m)
{
    uint64_t answer = 0;
    if (n % 2 == 0 && n > 1)
    {
    uint64_t kn = fastPower(k, n / 2, m);
    answer = (kn * kn) % m;
    return answer;
    }
    else if (n > 1)
    {
    answer = fastPower(k, 1, m) * fastPower(k, n - 1, m) % m;
    return answer; 
    }
    else
    answer = k % m;
        return answer;
    return EXIT_SUCCESS;
}

n 在声明时也被初始化为 1。

最佳答案

您的代码在数学上是“正确的”。您遇到的是迭代函数中循环计数器的整数溢出。由于 i 是一个带符号的 int,它被包裹成负数(与你的无符号 n 相比,它被解释为无符号,这将导致奇怪的结果)

如果你改变

for (int i = 1; i <= n; i++)
{
    answer = answer * k % m;
}

for (uint64_t i = 1; i <= n; i++)
{
    answer = answer * k % m;
}

然后 i 将匹配 n 的大小和符号,答案将匹配

关于C for循环几乎正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33271930/

相关文章:

c - getint 和 getch

c - 如何显示带有移动比率的数字之和?

arrays - Windows 批处理静态列表重命名-移动

c++ - 当子进程不刷新其标准输出时如何从子进程读取标准输出?

c - 逐个字符打印标准输入直到文件末尾

c++ - { } 和等号变量之间的区别

excel - vba - 循环通过 3 列

javascript - Uint8Array(8) 字符串化

compiler-errors - ffmpeg H264 avi 文件获取帧时间戳?? UINT64_C 错误

c++ - 如何从C++中的指针读取字节序列?