【发布时间】:2019-02-19 05:06:46
【问题描述】:
我尝试解决“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__
我认为标题似乎没有问题,而且主文件也是如此。 我的源文件有问题吗? 我想知道为什么调试器会卡在那里......
【问题讨论】:
-
如果你的
calculate()函数应该返回达到1的迭代次数,也许函数返回类型应该是int(或size_t,或unsigned long long)将指针传递给函数并返回类型为void。此外,重复的(*num)++比增加局部变量要慢——也许不是那么慢,但可能慢得多。而且,当然,您需要添加括号——当您增加指针而不是增加指针指向的位置时,您当前正在访问未知位置。 -
请注意,一般情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说: — 以下划线开头的所有标识符以及大写字母或另一个下划线始终保留用于任何用途。 — 所有以下划线开头的标识符始终保留保留用作普通和标记名称空间中具有文件范围的标识符。 另见What does double underscore (
__const) mean in C? -
您遇到了问题,因为您在 main 函数中分配了
num指向的数组,然后重复增加该指针,因此您无法跟踪数组的开始位置。但是你真的不需要数组;您只需要当前整数的周期数以及到目前为止找到的最大长度。你泄露了数组,因为你没有调用free()——尽管考虑到你已经丢失了malloc()返回的值,目前,这是一件好事! -
见Definitive C Book Guide and List。我推荐 K.N.King 的书。
-
感谢您非常详细地批评了我的代码。顺便问一下,如果不是借口,你能推荐一本学习C的书吗?我正在尝试在 C Programming : A Modern Approach 由 K.N.King 编写和 The C Programming Language 由 Dennis Ritchie 编写之间选择一本书。或者有没有更好的书适合我?