【问题标题】:greatest common factor function最大公因数函数
【发布时间】:2019-04-08 04:24:52
【问题描述】:

我正在尝试解决这个挑战问题,我的意思是通过引用一个函数来找到两个输入数字的 GCD。但是,我不确定我到底在哪里搞砸了。这是供参考的确切问题:

编写一个函数,接受 x 和 y 作为输入参数,并计算并返回两个值的最大公分母。

我尝试创建一个函数来查找 GCD,然后稍后仅引用该函数。我不确定我做错了什么。

#include <iomanip>
using namespace std;


int gcd;

cout << "Enter a valid integer: ";
  cin >> n >> m;

int digit = number(n, m);



return 0;
}

int number(int n, int m){

  for (int i=1; i<=n; ++i){
    int gcd = i;
    if(n%i==0 && m%i==0) {
      break;
  }

    return gcd;
}
  }

我应该得到这个: 输入两个整数:12 8 12和8的GCD是4。

但是,我得到了一个错误,gcd 没有在这个范围内声明,这没有意义,因为我在函数内部和外部都将它声明为 int。

【问题讨论】:

  • 你希望return gcd(n, m); 行做什么?
  • 那是个错误,我才意识到;在这种情况下,我只想打印两个数字的 gcd,这将由 i 表示。
  • @RSahu 在取出返回行中的错误并将其变为 return gcd 后; ,我仍然得到 gcd 没有声明的错误。
  • 这个错误是有道理的。 gcdif 语句的范围内定义。它不存在于它之外。
  • 记住花括号引入了一个新的范围。此外,main 中的 gcd 与其他函数中的 gcd 完全无关。在您最喜欢的 C++ 书籍中了解词法范围。

标签: c++ function


【解决方案1】:

对此有很好的递归算法,但由于它们是不允许的,我清理了你的实现:

  • 为 iostream 替换有故障的 iomanip
  • 将输入提示从“输入一个整数”更改为“输入两个整数”
  • 从你的主目录中删除了 i,你不需要它
  • 在你的 main 中用 gcd 替换了变量
  • 添加了一个 cout 以在您的 main 中显示结果
  • 我用你的 gcdfunction 重写了它,只保留你的中断条件
  • 与您的中断条件匹配的循环必须是从适当的数字开始的倒计时(即 min(m, n) 应该是初始值,我们向后循环直到达到 1)。
#include <iostream>
using namespace std;

int gcdfunction(int n, int m);

int main() {
  int n, m;

  cout << "Enter two integers: ";
  cin >> n >> m;

  int gcd = gcdfunction(n, m);
  cout << "GCD: " << gcd << "\n";
  return 0;
}

int gcdfunction(int n, int m){
  for (int i = m<=n ? m:n ; i > 1; i--) {
    if (n%i==0 && m%i==0) return i;
  }
  return 1;
}

【讨论】:

    【解决方案2】:

    简单的递归解决方案...试试这个。

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

    不用递归也可以实现 -

    int gcd(int a, int b)
    {
         while(b!=0)
         {
             int tmp = a;
             a = b;
             b = tmp % b;
         {
         return a;
     }
    

    现在主要功能..

    #include<iostream>
    using namespace std;
    int main()
    {
       int a,b;
       cout<<"Enter two number: ";
       cin>>a>>b;
       cout<<"GCD of two number: "<<gcd(a,b)<<endl;
    }
    

    【讨论】:

    • int gcd(int x, int y){return y? gcd(y,x%y) : x;} 也可以使用
    【解决方案3】:

    我希望你正在寻找这样的东西

    #include <stdio.h>
    
    int hcf(int, int); //function declaration 
    
    int main()
    {
    int a, b, result;
    
    printf(“Enter the two numbers to find their HCF: “);
    scanf(“%d%d”, &a, &b);
    result = hcf(a, b);
    printf(“The HCF of %d and %d is %d.\n”, a, b, result);
    
    return 0;
    }
    
    int hcf(int a, int b)
    {
                while (a != b)
                {
                      if (a > b)
                     {
                                a = a – b;
                      }
               else
                        {
                             b = b – a;
                       }
    }
    return a;
    }
    

    简单易懂的程序。

    【讨论】:

      【解决方案4】:

      您的功能需要稍作调整才能正常工作。

      1. gcd 必须在 for 循环之外定义,以便它可以用作返回值。
      2. for 循环中,在if 语句中使用break 在逻辑上是不正确的。如果你这样做,你将永远得到 1 作为你的答案。毕竟,n % 1m % 1 对于 nm 的所有值都为零。

      这是适用于我的测试的更新版本。

      int gcdfunction(int n, int m){
      
         int gcd = 1;
         for (int i=1; i<=n; ++i){
            if(n%i==0 && m%i==0) {
               gcd = i;
            }
         }
      
         return gcd;
      }
      

      请注意,the Euclidean algorithm 可能是计算两个数字的 GCD 的最有效算法。

      欧几里得算法也可以使用非递归函数轻松实现。

      int gcdfunction(int n, int m){
      
         // Make sure n is the smaller of the numbers.
         if ( n > m )
         {
            std::swap(n, m);
         }
      
         while ( m % n != 0 )
         {
            int next = m % n;
            m = n;
            n = next;
         }
      
         return n;
      }
      

      【讨论】:

      • 我做了一个 cout 命令,被 cout
      • @noviceclasscoder,只打印函数的返回值,在main。函数返回后,使用std::cout &lt;&lt; "GCD: " &lt;&lt; variable &lt;&lt; std::endl;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多