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
,但您声明它是错误的。@r3mainerarr
似乎是全局的,因此具有静态存储。arr[limit]的实例函数中的code>是一个无用的语句,充其量它什么也不做。@TomKarzes啊,你说得对。num
可以大于10^6。然后,arr[num]
可能会导致未定义的行为问题陈述甚至指出了这一点-注意:一旦链开始,术语允许超过一百万。@r3mainer哦,我的天哪!你解释得太好了,太棒了!现在代码运行得真的很快。。。!虽然这不是我解决Eu14问题的完整方案。。。但我把一切都搞砸了,编辑了一切,只是为了得到一些我昨天学过的回忆录作为输出。。。非常感谢你花时间指出我的问题!我真的很感激。