【问题标题】:find GCD in a one line code using function使用函数在一行代码中查找 GCD
【发布时间】:2020-12-07 17:24:43
【问题描述】:

问题是你写了一个程序来找到两个数字的 GCD,你应该定义一个函数来做到这一点,但挑战是函数体不应该超过 1 行,你只能使用一个分号!到目前为止,我尝试过并写了这个。你有什么想法吗?

#include <stdio.h>

int bmm(int m, int n) {
    while(m!=n) int a = m > n ? m -= n : n -= m;
    return m;
}

int main() {
    int m, n;
    scanf("%d%d", &m, &n);
    if (m < 0)m = -m;
    if (n < 0)n = -n;
    printf("%d", bmm(m,n));

    return 0;
}

【问题讨论】:

  • 他们可能希望它是递归的。您还可以阅读有关 Euclid 的 GCD 算法的信息。它与您的相似,但效率更高(步骤更少)。
  • 可以说while(m!=n) int a = m &gt; n ? m -= n : n -= m; 是两行。您可以在一行上堆放任意数量的代码(受编译器限制)。
  • int gcd_euclid(int a, int b) { return a % b == 0 ? b : gcd(b, a % b); }
  • int bmm(int m, int n) { return n ? bmm(n, m % n) : m; }

标签: c algorithm


【解决方案1】:

你可以用递归的方式在一行中解决它:

int gcd(int a, int b)
{
    return (b == 0 ? a : gcd(b, a % b));
}

【讨论】:

    【解决方案2】:

    你可以像这样使用 if...else 语句:

    #include <stdio.h>
    
    int bmm(int m, int n)
    {
       while(m!=0&&n!=0)
       {
          if(m>n)m-=n;
          else n-=m;
       }
       return m;
    }
    
    int main() 
    {
       int m, n;
       scanf("%d%d", &m, &n);
       if (m < 0)m =- m;
       if (n < 0)n =- n;
       printf("\n GCD = %d", bmm(m,n));
      return 0;
    }
    

    【讨论】:

    • 这不完全符合原帖中提到的要求
    • 这只是将 OP 的 ?: 重述为 if/else。这是 [可以说] more 行。而且,从技术上讲,OP 的解决方案不仅仅是一行 [因为 while]。
    • @CraigEstey 是的,我知道,但这里也有一个问题:int a = m > n ? m -= n : n -= m;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多