我在调试时遇到“ 3n + 1问题”的问题

时间:2019-02-19 05:06:46

标签: c collatz

我试图解决“ 3n + 1”问题。 当我调试代码时,它停留在第12行计算功能。 “根据Collat​​z猜想,j应该收敛到1。”

主文件

    #include "input_output.h"
    #include <stdlib.h>
    int main() {
        int i=0, j=0;`
        int *num;
        int maxCycle;
        int length;
        input(&i, &j);
        length = j - i + 1;
        num = (int*)malloc(sizeof(int)*(j - i+1));

这是问题代码

        while (i <= j) {            
            calculate(j, num);//<- it stuck at here when i dubug it.
            j--;                    
            num++;                  
        }

        maxCycle = findMax(length, num);
        output(maxCycle);
        return 0;
    }

源文件

    #include <stdio.h>
    #include "input_output.h"
    #pragma warning (disable:4996)
    void input(int *i, int *j) {
        scanf("%d %d", i,j);    
    }

    void calculate(int j, int* num) {

        while (j > 1) {     
            if (j % 2 == 0) {   
                j = j / 2;
                *num++;         
            }

            if (j % 2 == 1) {   
                j = j * 3 + 1;  
                *num++;         
            }
        }
    }

    int findMax(int length, int * num){
        int max = 0;
        int idx = 0;
        while (idx < length) {
            if (*num > max) max = *num;
            idx++;
            num++;
        }
        return max;

    }

    void output(int maxout) {
        printf("%d", maxout);
    }

标题

    #ifndef __input_output_H__
    #define __input_output_H__

    void input(int *i, int *j);         
    void calculate(int j,int *num); 
    int findMax(int length, int* num);
    void output(int maxout);



    #endif __input_output_H__

我认为标题似乎没有问题,而且主文件也没有问题。 我的源文件有什么问题吗? 我不知道为什么调试器会卡在这里...

2 个答案:

答案 0 :(得分:0)

您的循环永无止境:到达j == 1,但您继续应用3n + 1,这使您回到4,因此您永远处于循环中:

1 -> 4 -> 2 -> 1 -> ...

顺便说一句,

*num++;

没有按照您认为的去做。您要递增指针,然后访问该值(未使用)。就像您已经写过一样:

num++;

您应该写过(*num)++

答案 1 :(得分:-1)

问题出在j = j * 3 + 1;,如果'j'大于1且为奇数,则'j'继续增加。因此,它在calculate(int j,int *num)处挂起,因为它的while循环无限运行(j值将在一段时间后重置)。

编辑:

我已经收集了所有更正并添加了代码:

main.c:

#include "input_output.h"
#include <stdlib.h>

int main()
{
        int i=0, j=0;
        int *num,*ori;                  //New pointer required to remember the start position of num
        int maxCycle;
        int length;
        input(&i, &j);
        length = j - i + 1;
        num = (int*)calloc((size_t)(j-i+1),sizeof(int));
        ori=num;
        while (i <= j)
        {
                calculate(j, num);
                j--;
                num++;
        }
        num=ori;
        maxCycle = findMax(length, num);
        num=ori;
        output(maxCycle);
        return 0;
}

input_output.h:

#ifndef INPUT_OUTPUT_H
#define INPUT_OUTPUT_H

void input(int *i, int *j);
void calculate(int j,int *num);
int findMax(int length, int* num);
void output(int maxout);

#endif

input_output.c:

#include <stdio.h>
#include "input_output.h"
void input(int *i, int *j) {
        printf("Enter the i & j:\n");
        scanf("%d%d",i,j); 
        printf("Values entered:\ni: %d\nj: %d",*i,*j);
}

void calculate(int j, int* num) {

        while (j > 1) {     
                if (j==1)
                        break;
                if (j % 2 == 0) {   
                        j = j / 2;
                        (*num)++;         
                }
                else{   
                        j = j * 3 + 1;  
                        (*num)++;         
                }
        }

        printf("\nLength Value: %d\n",*num);
}

int findMax(int length, int * num){
        int max = 0;
        int idx = 0;
        printf("\nLength Values:\n");
        while (idx < length) {
                printf("%d ",*num);
                if (*num > max) 
                        max = *num;
                idx++;
                num++;
        }
        return max;

}

void output(int maxout) {
        printf("\nResult: %d", maxout);
}

在Linux上使用gcc input_output.c main.c -Wall -Wextra -pedantic -Wconversion -std=gnu11 -o collatz

进行编译

为进一步澄清,请发表评论。