【问题标题】:Odd behavior in my code for a certain test case我的代码中针对某个测试用例的奇怪行为
【发布时间】:2019-05-23 06:24:59
【问题描述】:

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

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 91 37 7 93 4 4 97 37 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 69 58 55 552 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;
}

【问题讨论】:

  • 你能解释一下这个测试用例失败的原因吗?
  • 这是我的问题。我不知道。
  • 他的意思是你怎么知道它失败了?预期和实际输出是多少?
  • 不输出。没有。我试图在main 中的scanf 之前打印出一些随机的东西,它甚至没有打印出来。
  • 您实际上是在输入 100 个整数吗?

标签: c pointers for-loop


【解决方案1】:

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

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

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

另外,一个更快的 gcd 实现,称为 Euclid 算法,如下所示:

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

【讨论】:

    【解决方案2】:

    您的函数nzd() 未能正确处理a == 0 的情况并陷入死循环。你也需要处理这种情况:

    int nzd(int a, int b)
    {
        if(a==b || a==0 || b==0) 
            return a;
        if(a>b) 
            return nzd(a-b, b);
        return nzd(a, b-a);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 2012-12-04
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多