程序设计方法学(作业2)求两个正整数的最大公约数和最小公倍数

题目:求两个正整数的最大公约数和最小公倍数。
一、基本要求:
1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
二、提高要求:
1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。
三、 算法的计算过程如下:
1.辗转相除法
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。
辗转相除法的主要步骤是:
(1)用小的一个数除大的一个数,得第一个余数;
(2)用第一个余数除小的一个数,得第二个余数;
(3)用第二个余数除第一个余数,得第三个余数;
(4)逐次用后一个余数去除前一个余数,直到余数为0为止.
程序设计方法学(作业2)求两个正整数的最大公约数和最小公倍数_第1张图片
2.更相减损法
定义:更相减损法原本是为了约分而设计的:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
1.任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
2.以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数,相当于不要第一步。
程序设计方法学(作业2)求两个正整数的最大公约数和最小公倍数_第2张图片
3.穷举法
穷举法即将所有的可能的结果从两数之中小的那个数开始,依次减1,然后带入进行验证是否满足被两数相除余数为0,若是找到符合的第一个数字,则即为最大公约数
4.所有具体的代码如下:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//文件名 :最大公约数.cpp

//创建者 : 软工16411060204

//创建日期 : 20180907

//开发环境 : Visual Studio

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



#include 



using namespace std;



class C_commondivisor {

public:

    C_commondivisor();

    int input();    //获得输入的数字

    int output(int i);    //输出结果

    int mainmenu();    //菜单函数

    int div_alg();    //辗转相除法

    int phase_sub();    //相减法

    int exhaustion();    //穷举法

private:

    int m_num1;

    int m_num2;

    int m_result;    //存储算出的最大公约数

};



C_commondivisor::C_commondivisor()

{

    m_num1 = 0;

    m_num2 = 0;

    m_result = 0;

}



//获得输入函数

int C_commondivisor::input()

{

    cout << "                请输入要计算的一个数字:";

    cin >> m_num1;

    cout << "                请输入要计算的另一个数字:";

    cin >> m_num2;

    cout << "\n\n" << endl;

    //判断两个数字的大小,大的数字赋值给m_num1

    if (m_num2 > m_num1)

    {

        //交换两数的数值

        m_num1 = m_num2 - m_num1;

        m_num2 = m_num2 - m_num1;

        m_num1 = m_num1 + m_num2;

    }

    return 0;

}



//输出结果函数

int C_commondivisor::output(int i)

{

    cout << "\n\n                数字" << m_num1 << "和数字" << m_num2;

    if (i == 2)

    {

        cout << "用相减法计算得到";

    }

    else if (i == 3)

    {

        cout << "用穷举法计算得到";

    }

    else

    {

        cout << "用辗转相除法得到";

    }

    cout << "的最大公约数为:" << m_result << "\n\n\n\n\n\n" << endl;

    return 0;

}



//菜单函数

int C_commondivisor::mainmenu()

{

    cout << "                本程序为计算两个数的最大公约数的程序    " << endl;

    while (true)

    {

        cout << "                辗转相除法请输入”1“" << endl;

        cout << "                相    减   法请输入”2“" << endl;

        cout << "                穷    举   法请输入”3“" << endl;

        cout << "                退           出请输入”0“" << endl;

        cout << "                若输入其他数字,则选择辗转相除法计算" << endl;

        cout << "\n\n                请 选 择 计 算 方 式 :";

        int tmp = 0;

        cin >> tmp;

        if (tmp == 1)

        {

            input();

            m_result = div_alg();    //辗转相除法计算

        }

        else if (tmp == 2)

        {

            input();

            m_result = phase_sub();    //相减法计算

        }

        else if (tmp == 3)

        {

            input();

            m_result = exhaustion();    //穷举法计算

        }

        else if (tmp == 0)

        {

            break;    //退出循环,结束程序执行

        }

        else

        {

            input();

            m_result = div_alg();    //若输入不在范围内,则使用辗转相除法计算

        }

        //依据计算输出相应的计算方式及结果

        output(tmp);

    }

    return 0;

}



//辗转相除法

int C_commondivisor::div_alg()

{

    int tmp1 = m_num1;

    int tmp2 = m_num2;

    for (; tmp1 % tmp2 != 0; )

    {

        tmp1 = tmp1 % tmp2;

        //tmp1整除以tmp2后,tmp1为两数字间的小数字

        //以下三句均为实现调换数字的数值,使tmp1为最大数字

        tmp1 = tmp2 - tmp1;

        tmp2 = tmp2 - tmp1;

        tmp1 = tmp1 + tmp2;

    }

    return tmp2;

}



//相减法

int C_commondivisor::phase_sub()

{

    int tmp1 = m_num1;

    int tmp2 = m_num2;

    for (; tmp1 - tmp2 != 0; )

    {

        tmp1 = tmp1 - tmp2;

        //判断两个数的大小,让大数始终为tmp1

        if (tmp2 > tmp1)

        {

            tmp1 = tmp2 - tmp1;

            tmp2 = tmp2 - tmp1;

            tmp1 = tmp1 + tmp2;

        }

    }

    return tmp2;

}



//穷举法

int C_commondivisor::exhaustion()

{

    //从两个数字中最小的数字开始,依次判断是否能整除以输入的两个数字,若可以,则输出当前的结果,并结束循环

    int i = 0;

    for (i = m_num2; i <= m_num2; i--)

    {

        //若当前整数可以整除输入的两个数字,则这个数即为最大公约数,终止循环

        if ((m_num1 % i) == 0 && (m_num2 % i) == 0)

        {

            break;

        }

    }

    return i;

}



int main(int argc,char** argv[])

{

    C_commondivisor CCD;

    CCD.mainmenu();

    return 0;

}

5.调试及测试截屏
程序设计方法学(作业2)求两个正整数的最大公约数和最小公倍数_第3张图片
程序设计方法学(作业2)求两个正整数的最大公约数和最小公倍数_第4张图片
程序设计方法学(作业2)求两个正整数的最大公约数和最小公倍数_第5张图片

你可能感兴趣的:(程序设计方法)