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