最大公因子函数

时间:2019-04-08 04:24:53

标签: c++ function

我正在尝试解决这个挑战性问题,即我要通过引用一个函数来找到两个输入数字的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。

4 个答案:

答案 0 :(得分:1)

有很多不错的递归算法,但是由于不允许使用它们,我清理了您的实现:

  • 为iostream替换错误的iomanip
  • 将输入提示从“输入整数”更改为“输入两个整数”
  • 将i从您的主要帐户中删除,您不需要它
  • 在主目录中用gcd替换的变量
  • 添加了一个提示,以在主画面中显示结果
  • 使用您的gcd函数重写了它,仅保留您的中断条件
  • 匹配中断条件的循环必须从一个合适的数字开始倒数(即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;
}

答案 1 :(得分:1)

简便的递归解决方案...尝试此操作。

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;
}

答案 2 :(得分:0)

我希望您正在寻找类似的东西

#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;
}

简单的程序,易于理解。

答案 3 :(得分:0)

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

  1. gcd必须在for循环之外定义,以便可以将其用作返回值。
  2. for循环中,在break语句中使用if在逻辑上是错误的。如果这样做,您将始终得到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;
}