【发布时间】:2020-08-22 17:45:26
【问题描述】:
没有记忆这个Euler Project 14 的解决方案可以正常工作!然后通过记忆,它应该工作得更快......但它几乎停在i = 1818 或附近。多么奇怪!很难理解有什么问题!你能帮忙吗?
#include <stdio.h>
#define limit 1000000
int arr[limit];
int fun(long long int i) {
long long int count = 1;
long long int num;
arr[limit];
num = i;
while (num > 1) {
if (arr[num] != NULL) {
count = count - 1 + arr[num];
break;
}
if (num % 2 == 0) {
num = num / 2;
count++;
} else {
num = 3 * num + 1;
count++;
}
}
arr[i] = count;
return count;
}
int main() {
long long int i;
for (i = 2; i < limit; i++) {
long long int count = fun(i);
printf("d %lld c: %lld\n", i, count);
}
return 0;
}
【问题讨论】:
-
将
arr[]声明为static数组,否则每次到达return语句时它都会消失。如果你想要合理的结果,你也应该初始化它。 -
您的函数
fun返回一个int,那么为什么将它存储在long long int中呢?这样做没有任何好处。如果它不适合int,那么返回值将是错误的,你用它做什么都没关系。可能您希望该函数返回long long int,但您声明它是错误的。 -
@r3mainer
arr似乎是全局的,因此具有静态存储。函数内部arr[limit];的实例是一个无用的语句,充其量什么都不做。 -
@TomKarzes 啊,你是对的。
-
num可以高于 10^6。那么arr[num]会导致未定义的行为
标签: c algorithm dynamic computer-science memoization