最大公因数函数

greatest common factor function

本文关键字:函数 公因数      更新时间:2023-10-16

我正在尝试解决这个挑战问题,我打算通过引用一个函数来找到两个输入数字的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 812 和 8 的 GCD 是 4。

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

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

  • 将有故障的 iomanip 替换为 iostream
  • 将输入提示从"输入一个整数">
  • 更改为"输入两个整数">
  • 从您的主目录中删除了 i,您不需要它
  • 将主变量替换为 gcd
  • 添加了一个 cout 以在您的主目录中显示结果
  • 使用您的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;
}

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

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

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

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

简单的程序,易于理解。

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

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

这是在我的测试中有效的更新版本。

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

请注意,欧几里得算法可能是计算两个数字的 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;
}