gpt4 book ai didi

C 程序编译,但在运行时失败(数组太大?)。和 'checklist' 的建议?

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:24 25 4
gpt4 key购买 nike

我正在编写一个程序来寻找从 1,000,000 开始的最长 Collat​​z 序列。

我真的为这段代码感到自豪,它看起来如此高效、干净、写得很好……直到我尝试运行它。经过一些调试使其能够编译后,我发现当我运行程序时,它崩溃了。

我都用过

int array[1000000];

int *array;
array = (int*)calloc(s, sizeof(int));

(其中 s=1000000)

声明一个包含 1,000,000 个空格的数组。

所以我的问题的 A) 部分:声明这样大小的数组是荒谬的还是可能的?

和我的问题的 B) 部分:这用于各种“ list ”,检查已经看到了哪些数字。有没有我应该使用的更简单或更好或只是不同的“核对”数字的方法?

代码如下:

// This is a program to find the longest Collatz sequence starting under 1,000,000

#include <stdio.h>
#include <stdlib.h>

int main()
{

// Collatz sequence: IF EVEN n/2 :: IF ODD 3n+1

//define ints
int i;
int n;
int c; // counter of sequence length
int longestsequence = 0;
int beststart;
int s = 1000000; //size of array

//define int array
//int array[999999];

//define array using calloc
//define pointer for calloc int array
int *array;
// do your calloc thing
array = (int*)calloc(s, sizeof(int)); // allocates 1,000,000 spots (s) of size "int" to array "array"

//fill array
for(i = 0; i < 1000000; i++)
{
array[i] = i;
}

for(i = 999999; i > 500000; i--)
{
if(array[i] == 0) // skip if number has already been seen
goto done;

n = i;
c = 0;

//TEST
printf("Current starting number is: %d\n", i);
//TEST

while(n != 4) // run and count collatz sequence
{

//TEST
//printf("test1\n");
//TEST

if(n % 2 == 0) // EVEN
n = n/2;
else // ODD
n = 3 * n + 1;

//TEST
//printf("test2\n");
//TEST

c++;

//TEST
//printf("test3\n");
//TEST

if(n < 1000000 && array[n] != 0) // makes note of used numbers under 1000000
array[n] = 0;

//TEST
//printf("test4\n");
//TEST

}

if(longestsequence < c)
{
longestsequence = c;
beststart = i;
//TEST
printf("Current best start is: %d\n", beststart);
//TEST
}

done:
}

printf("the starting number that produces the longest Collatz sequence is...\n");
printf("%d\n", beststart);


getchar();
return 0;
}

感谢您提供的所有帮助和建议!总是感谢指向有用资源的链接。


更新!

1.我的代码现在看起来像这样^^^^

2.程序运行,然后神秘地停在i999167

最佳答案

for(i = 999999; i > 4; i++)

在这里您可以轻松地超越数组边界。我猜你的意思是

for(i = 999999; i > 4; --i)
// ^^^

此外,在您的实现中,100 万个元素是不够的。

n == 999999为例。在第一步中,您计算​​ 3 * n + 1,这显然远大于 1000000。一个简单的解决方案是更改

    if(array[n-1] != 0) // makes note of used numbers
array[n-1] = 0;

进入

    if(n < s && array[n-1] != 0) // makes note of used numbers
array[n-1] = 0;

n 超出数组边界时,它只会禁用结果查找。

关于C 程序编译,但在运行时失败(数组太大?)。和 'checklist' 的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com