yyyf 发表于 2021-1-16 19:01:23

新手编写函数求两个整数的最大公约数和最小公倍数遇到的问题


/*编写函数判求两个整数的最大公约数和最小公倍数*/
#include<iostream>
int Max_Common_Divisor(int m, int n);//求最大公约数
int Min_Common_Multiple(int p, int q);//求最小公倍数
int main()
{
      int a, b;
      std::cout << "请输入两个整数 :\n";
      std::cin >> a >> b;
      std::cout<<"最大公约数是: "<<Max_Common_Divisor(a,b)<<"\n\n";
      std::cout<<"最小公倍数是:"<<Min_Common_Multiple(a,b)<<"\n\n";
      return 0;
}


int a[] = { 0 }, b[] = { 0 }, * pa,*pb,*pc;
int num1, num2;/*约数计数器*/
int temp1, temp2;
int temp3;/*最大公约数*/
int c[] = { 0 };/*存放公约数*/
int num3;/*数组c[]计数器*/


int Max_Common_Divisor(int m, int n)//求最大公约数
{
      for(int i=1;i<=m;i++)
                if (m % i == 0)
                {
                        a = i;
                        num1++;
                }
      for (int j = 1; j <= n; j++)
                if (n % j == 0)
                {
                        b = j;
                        num2++;
                }
      pa = a;
      pb = b;
      if (num1 <= num2)
      {
                temp1 = *pa;
                temp2 = *pb;
                /*pa指针先不动,pb指针动*/
                while (temp1 != temp2 && pa != NULL && pb != NULL)
                {
                        pb++;
                        temp2 = *pb;
                        if (temp1 == temp2)
                        {
                              c = temp1;
                              num3++; /*数组c[]计数器*/
                              pa++;
                              temp1 = *pa; /*temp1=++pa也是可以的*/
                        }
                }
      }
      else
      {
                temp1 = *pa;
                temp2 = *pb;
                /*pb指针先不动,pa指针先动*/
                while (temp1 != temp2 && pa != NULL && pb != NULL)
                {
                        pa++;
                        temp1 = *pa;
                        if (temp1 == temp2)
                        {
                              c = temp1;
                              num3++;
                              pb++;
                              temp2 = *pb;
                        }
                }
      }
      /*遍历c,找最大值*/
      pc= c;
      temp3 = *pc;
      while (pc != NULL)
      {
                pc++;
                if (temp3 <= (*pc))
                {
                        temp3 = *pc;
                }
      }
      return temp3;      
}
int d;/*函数Max_Commmn_Divisor的返回值*/
int factor1, factor2;/*每个数的一个因子,本数除以最大公约数*/

int Min_Common_Multiple(int p, int q)//求最小公倍数
{
      d=Max_Common_Divisor(p,q);
      factor1 = p / d;
      factor2 = q / d;
      return d * factor1 * factor2;
}
原谅新手的函数写的如此笨,还是想问一下编译时if(temp3<=(*pc))这一句 *pc引发了异常,这是为什么?怎么解决?

jackz007 发表于 2021-1-16 20:16:41

本帖最后由 jackz007 于 2021-1-16 20:24 编辑

#include<iostream>

int Max_Common_Divisor(int m , int n)
{
      if(n) return Max_Common_Divisor(n ,m % n) ;
      else return m                               ;
}

int Min_Common_Multiple(int p , int q)
{
      return p * q / Max_Common_Divisor(p , q)    ;
}

int main()
{
      int a , b                                                      ;
      std::cout << "请输入两个整数 : "                               ;
      std::cin >> a >> b                                             ;
      std::cout<<"最大公约数是: "<<Max_Common_Divisor(a,b)<<"\n\n";
      std::cout<<"最小公倍数是:"<<Min_Common_Multiple(a,b)<<"\n\n" ;
}

jackz007 发表于 2021-1-16 20:24:41

本帖最后由 jackz007 于 2021-1-16 20:28 编辑

      发了一个全代码的居然被 "吞" 掉了,C ++ 代码而已,也会犯忌讳?
      楼主,用递归的辗转相除法求取最大公约数,很简单,用不着那么麻烦。
int Max_Common_Divisor(int m , int n)
{
      if(n) return Max_Common_Divisor(n ,m % n) ;
      else return m                               ;
}

int Min_Common_Multiple(int p , int q)
{
      return p * q / Max_Common_Divisor(p , q)    ;
}

yyyf 发表于 2021-1-16 22:30:17

谢谢
页: [1]
查看完整版本: 新手编写函数求两个整数的最大公约数和最小公倍数遇到的问题