C 回忆录本应该有用的

C 回忆录本应该有用的,c,algorithm,dynamic,computer-science,memoization,C,Algorithm,Dynamic,Computer Science,Memoization,无需记忆,此解决方案效果良好!然后通过记忆,它应该工作得更快。。。但它几乎停在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; wh

无需记忆,此解决方案效果良好!然后通过记忆,它应该工作得更快。。。但它几乎停在
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;
}
#包括
#定义限制1000000
int arr[限值];
int fun(长int i){
长整型计数=1;
长整型数;
arr[极限];
num=i;
while(num>1){
如果(arr[num]!=NULL){
计数=计数-1+arr[num];
打破
}
如果(数值%2==0){
num=num/2;
计数++;
}否则{
num=3*num+1;
计数++;
}
}
arr[i]=计数;
返回计数;
}
int main(){
长内i;
对于(i=2;i
好的,我认为您的代码的主要问题是Collatz序列可以给您提供的数字比您在降到1之前开始使用的数字高得多。根据,你应该找到1000000以下的起始数,在达到零之前产生最长的链。但是从1819年开始的Collatz序列包含了超过一百万的数字。因此,您试图访问超出范围的
arr[]
元素

此外,正如评论中指出的,声明
arr[limit]fun()
函数中,code>没有任何有用的功能。如果您在编译器中启用了警告,它可能会标记此警告,以及将
void*
指针与整数进行比较的语句
If(arr[num]!=NULL)

如果将
while()
块的第一条语句替换为
If(num
,那么至少应该避免分段错误

您的
main()
函数需要重写,以找到产生最长链的起始编号,而不是仅仅打印出一百万行数据

如果愿意,您可以尝试运行以下命令:

#包括
#定义限制1000000
int arr[LIMIT]={0};
长乐趣(长i){
长计数=1;
长数;
num=i;
while(num>1){
如果(num
arr[]
声明为
静态
数组,否则每次到达
return
语句时它都会消失。如果希望得到合理的结果,还应该初始化它。函数
fun
返回
int
,那么为什么要将其存储在
长整型中呢?这样做没有好处。如果它不适合
int
,那么返回值将是错误的,无论您如何处理它。您可能希望函数返回一个
long-long-int
,但您声明它是错误的。@r3mainer
arr
似乎是全局的,因此具有静态存储。
arr[limit]的实例是一个无用的语句,充其量它什么也不做。@TomKarzes啊,你说得对。
num
可以大于10^6。然后,
arr[num]
可能会导致未定义的行为问题陈述甚至指出了这一点-注意:一旦链开始,术语允许超过一百万。@r3mainer哦,我的天哪!你解释得太好了,太棒了!现在代码运行得真的很快。。。!虽然这不是我解决Eu14问题的完整方案。。。但我把一切都搞砸了,编辑了一切,只是为了得到一些我昨天学过的回忆录作为输出。。。非常感谢你花时间指出我的问题!我真的很感激。