鱼C论坛

 找回密码
 立即注册
查看: 1134|回复: 4

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

[复制链接]
发表于 2021-1-16 19:01:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

/*编写函数判求两个整数的最大公约数和最小公倍数*/
#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 - 1] = i;
                        num1++;
                }
        for (int j = 1; j <= n; j++)
                if (n % j == 0)
                {
                        b[j - 1] = 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[num3] = 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[num3] = temp1;
                                num3++;
                                pb++;
                                temp2 = *pb;
                        }
                }
        }
        /*遍历c[num3],找最大值*/
        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引发了异常,这是为什么?怎么解决?
最佳答案
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)    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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" ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-16 22:30:17 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 03:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表