collat​​z c代码逻辑错误

时间:2014-03-26 00:10:26

标签: c collatz

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”并且控制台自行压缩。我正在使用开发。 对不起我糟糕的英语,但我希望我很清楚。

2 个答案:

答案 0 :(得分:0)

我算了四个错误:

  • array[count]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;
    }
}

答案 1 :(得分:0)

首先,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;
        }
    }
}