使用数组的 2 个数字的最大公约数

the biggest common divisor of 2 numbers using arrays

本文关键字:数字 最大公约数 数组      更新时间:2023-10-16

如何使用数组找到 2 个数字的最大公约数?我尝试使用 2 个数组解决它,但我无法完成它。我怎样才能改进这个计划?

#include <iostream>
using namespace std;
int main()
{
   unsigned int A[2][10], B[2][10], a, b, c_exp, d, i1, P, x;
   bool apartine = false;
   cout << "a="; cin >> a;
   cout << "b="; cin >> b;
   P = 1;
   c_exp = 0;
   i1 = 0;
   while (a % 2 == 0)
   {
      c_exp++;
      a = a/2;
   }
   if (c_exp != 0)
   {
      A[i1][0] = 2;
      A[i1][1] = c_exp;
      i1++;
   }
   d = 3;
   while (a != 1 && d <= a)
   {
      c_exp=0;
      while (a % d == 0)
      {
         c_exp++;
         a = a/d;
      }
      if (c_exp!=0)
      {
         A[i1][0] = d;
         A[i1][1] = c_exp;
         i1++;
      }
      d = d+2;
   }
   cout << "nMatricea A contine:";
   for (int i = 0; i < i1; i++)
   {
      cout << "n";
      for (int j = 0; j < 2; j++)
      cout << A[i][j] << ",";
   }
   c_exp = 0;
   i1 = 0;
   while (b % 2 == 0)
   {
      c_exp++;
      b = b/2;
   }
   if (c_exp != 0)
   {
      B[i1][0] = 2;
      B[i1][1] = c_exp;
      i1++;
   }
   d = 3;
   while (b != 1 && d <= b)
   {
      c_exp = 0;
      while (b % d == 0)
      {
         c_exp++;
         b = b/d;
      }
      if (c_exp != 0)
      {
         B[i1][0] = d;
         B[i1][1] = c_exp;
         i1++;
      }
      d = d+2;
   }
   cout << "nMatricea B contine:";
   for (int i = 0; i < i1; i++)
   {
      cout << "n";
      for (int j = 0; j < 2; j++)
         cout << B[i][j] << ",";
   }
   return 0;
}

从现在开始,我必须找出第一个数组的第一个数字是否存在于第二个数组中,在此之后,我必须比较两个数组的相同数量的指数和我必须将其添加到产品的最低数量的指数。在此之后,我必须将第二个数字重复相同的过程到第一个数组的最后一个数字。问题是我不知道怎么写这个。我不得不提到这个程序并不完整。

有什么想法吗?

如果您需要更好的解决方案,则可以避免数组并使用以下逻辑。

int main()
{
    int a =12 ,b = 20;
    int min = a>b ? a:b; // finding minimum
    if(min > 1)
    {
        for (int i=min/2; i>1; i--)//Reverse loop from min/2 to 1
        {
            if(a%i==0 && b%i==0)
            {
                cout<<i;
                break;
            }
        }
    }
    else if(min == 1)          
    {
        cout<<"GCD is 1";
    }
    else
        cout<<"NO GCD";
    return 0;
}

您还可以检查工作示例最大公约数

我不太确定您要用代码实现什么。它看起来很复杂。如果我找到两个数字的最大公约数,我会做如下事情:

## This is not a correct implementation in C++ (but close to it) ##
Read the two integers **a** and **b**
int max_div(int a, int b){
    int div = a > b ? a : b;
    while (div != 1 && (a%div != 0 && b%div != 0)){
        div--;
    }
    return div;
}

此函数从 a 和 b 的最小值作为可能的最高公约数开始,然后向后工作,直到以下两种可能的结果之一:

  1. 它找到一个公约数(a%div == 0 和 b%div == 0)
  2. 它达到一个(总是一个公约数)

编辑:现在,如果没有找到更高的除数,则返回一个。(返回零,这毫无意义)