c - 我的代码中某个测试用例的奇怪行为

标签 c pointers for-loop

程序应该交换没有共同点的相邻元素,并且一个元素只能交换一次。 当我运行该程序时,几乎任何输入都可以正常工作。除了这个:

100//输入元素数量

48 92 76 93 17 38 59 34 53 99 58 20 50 0 38 37 16 36 91 12 59 1 76 82 20 76 7 72 13 70 64 23 81 70 41 69 11 0 16 41 37 83 41 99 73 79 4 38 24 32 87 38 95 24 77 30 61 13 89 67 87 76 22 31 67 31 25 90 6 76 21 43 40 55 72 91 91 28 18 58 72 71 83 22 99 23 86 58 75 53 69 29 5 55 46 8 98 55 19 46//元素

对于此输入,程序将挂起并且不打印任何内容。有人知道这个特殊情况是怎么回事吗?

#include <stdio.h>
int nzd(int a, int b)
{
    if(a==b || b==0) 
        return a;
    if(a>b) 
        return nzd(a-b, b);
    return nzd(a, b-a);
}
int swap(int *niza, int i)
{
    int temp;
    temp=*(niza+i);
    *(niza+i)=*(niza+i+1);
    *(niza+i+1)=temp;
}
int main()
{
    int a[100], n, i;
    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }
    for(i=0; i<n; i++)
    {
        if(i+1==n) continue;
        if(nzd(a[i], a[i+1])==1)
        {
            swap(a, i);
            i++;
        }
    }
    for(i=0; i<n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

最佳答案

您的 gcd 函数检查 b==0 的情况,但不检查 a==0 的情况。因为您跳过了该检查,所以最终会调用 nzd(0, b-0); ,这与之前的调用完全相同。这会使您陷入无限递归循环,最终导致堆栈溢出。

在您的函数中添加对此情况的检查:

if(a==b || b==0 || a == 0)

此外,gcd 的更快实现(称为欧几里得算法)如下:

int gcd(int a, int b)
{
    if (b==0) {
        return a;
    } else {
        return (b, a%b);
    }
}

关于c - 我的代码中某个测试用例的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907508/

相关文章:

iphone - SQLite iPhone数据插入问题

C - 如何在 for 循环中每次在不同的变量上迭代相同的指令

C - 'malloc' 似乎无法正常工作

javascript - Jquery Onload 函数停止 for 循环,在函数内部传递 for 循环 x

python - 循环一维字典

javascript - 在 Javascript 的 For 循环中从另一个数组填充数组

c - SSE2 指令将一个 8x16 寄存器转换为两个具有偶数和奇数索引元素的 4x32 寄存器

c - 失败的 malloc() 的单元测试

指针与参数和返回值中的值

c++ - C++子数组与现有数组的偏移量