C for循环几乎正确

时间:2015-10-22 01:21:27

标签: 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。

1 个答案:

答案 0 :(得分:1)

您的代码在数学上是“正确的”。您遇到的是迭代函数中循环计数器上的整数溢出。由于private String pickDefaultResponse() { // Pick a random number for the index in the default response list. // The number will be between 0 (inclusive) and the size of the list (exclusive). int prevIndex; int newIndex; int index = randomGenerator.nextInt(defaultResponses.size()); return defaultResponses.get(index); } 是一个带符号的int,它会被包裹成负数(与未签名的i相比,被解释为无符号,这将导致奇怪的结果)

如果你改变了

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的尺寸和签名,答案将匹配