我试图解决“ 3n + 1”问题。 当我调试代码时,它停留在第12行计算功能。 “根据Collatz猜想,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__
我认为标题似乎没有问题,而且主文件也没有问题。 我的源文件有什么问题吗? 我不知道为什么调试器会卡在这里...
答案 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
为进一步澄清,请发表评论。