У меня проблема с «3n + 1 проблема». Когда я отлаживаю это - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался решить проблему «3n + 1».Когда я отлаживал свой код, он застревал в строке 12, функция вычисления.«Согласно гипотезе Коллатца, 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 голосов
/ 19 февраля 2019

Ваш цикл никогда не заканчивается: вы достигаете j == 1, но вы продолжаете применять 3n + 1, что заставляет вас вернуться к 4, и поэтому вы находитесь в цикле навсегда:

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

Кстати, это:

*num++;

не делает то, что вы думаете, что делает.Вы увеличиваете указатель, а затем получаете доступ к значению (которое не используется).Как если бы вы написали:

num++;

Вы должны были написать (*num)++.

0 голосов
/ 19 февраля 2019

Проблема в j = j * 3 + 1;, «j» продолжает увеличиваться, если «j» больше 1 и нечетно.Таким образом, он висит на 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

Для уточнения, пожалуйста, прокомментируйте.

...