【发布时间】:2019-04-24 07:30:42
【问题描述】:
我被要求将这个伪代码翻译成 C 程序:
rep := 0
while A not empty:
B := []
for x in A, y in A:
if x != y: append absolute_value(x - y) to B
A := B
rep := rep + 1
我最终得到了这个:
int iterateIt(int a_count, int* a) {
unsigned long long i, j, k;
unsigned long long count = a_count;
for( i = 1 ; i < a_count ; i++ )
count *= count-1;
int *b = (int *) malloc(count * sizeof(int));
count = 0;
k = 0;
for( i = 0 ; i < a_count ; i++ ){
for( j = i ; j < a_count ; j++ ){
if(a[i] != a[j]){
b[k] = abs(a[i] - a[j]);
k++;
}
}
}
if( k > 0){
return 1 + iterateIt(k, b);
}
free(b);
return 1;
}
我使用递归来返回算法的迭代次数。实际上,我取 A 的任何两个不同对象之间的差异,并将绝对值放在 B 中,我会在 B 上重复。
对于简单的输入,我得到了正确的结果,但我不明白为什么输入如下:
161 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
或41 352 9483 50000
(第一个数字是A的元素个数)
我收到分段错误错误。
感谢您的帮助
【问题讨论】:
-
你为什么要把
count *= count-1;放在一个循环中?它计算什么? -
你没有测试
malloc()的返回值。我的猜测是,您正在计算count中的一个巨大甚至负数(因为溢出)值,因此malloc()失败,然后您尝试写入生成的空指针。 -
您使用 IDE 吗?它有调试器吗?你知道怎么用吗?它是您最好的朋友,可以让您轻松解决此类问题,而无需询问我们
标签: c arrays recursion segmentation-fault