2
static void collatz(int i)
{
    int x=0,a=0,res=0,count=0;
    int array[50];
    array[0]=i;
    while(array[count]!=0)
    {
        if(array[count]%2==0)
        {
            count++;
            array[count]=i/2;
        }
        else
        {
            count++;
            array[count]=3*array[count-1]-1;
        }
    }
}
int main()
{
    int a;
    scanf("%d",&a);
    collatz(a);
    system("pause");
    return 0;
}

当我编译并运行代码时,我输入 8 作为“a”,控制台会自行崩溃。我正在使用开发者 c。对不起我糟糕的英语,但我希望我足够清楚。

4

2 回答 2

0

我数了四个错误:

  • array[count]循环应该在is时终止1,而不是0
  • 你应该检查它count是否小于 49
  • array[count]=i/2应该array[count]=array[count-1]/2
  • array[count]=3*array[count-1]-1应该array[count]=3*array[count-1]+1

因此,修复了这些问题并略微缩短的代码可能是:

static void collatz(int i) {
    int count=0;
    int array[50];
    array[0]=i;
    while (count < 49) {
        int j = array[count++];
        if (j == 1)
           break;
        else if(j % 2 == 0)
            array[count]=j/2;
        else
            array[count]=3*j+1;
    }
}
于 2014-03-26T00:51:56.110 回答
0

首先,while循环是错误的,应该在while结束时结束array[count] == 1,这样就可以while(array[count] > 1)用来测试了。

第二,array[count]=i/2;错了,你应该使用array[count]=array[count-1]/2;.

第三,你应该检查count < 50,因为你声明int array[50];

static void collatz(int i) 
{
    int x=0,a=0,res=0,count=0;
    int array[50]= {0};
    array[0]=i;
    while(array[count] > 1 && count < 50)
    {
        if(array[count]%2==0)
        {
            count++;
            array[count]=array[count-1]/2;
        }
        else
        {
            count++;
            array[count]=3*array[count-1]-1;
        }
    }
}
于 2014-03-26T01:04:20.630 回答