一、题目分析
用辗转相除法求N个数的最大公约数和最小公倍数。用C++语言实现程序解决问题。
1.程序风格良好(使用自定义注释模板);
2.提供友好的输入输出,并进行输入数据的正确性验证。
二、算法构造
三、算法实现
#include <iostream>
#include <vector>
using namespace std;
int gcd(int a,int b) //最大公约数
{
int r = a%b;
while(r)
{
a = b;
b = r;
r = a%b;
}
return b;
}
int lcm(int a,int b) //最小公倍数:两数乘积=最小公倍数与最大公约数乘积
{
return a * b / gcd(a,b);
}
int main()
{
vector <int> a;//定义自动增长的对象数组a用来保存输入数组
int t1,t2,k,n,c;
cout << "请输入所要求的数据的个数:";
while(cin >> n)
{
cout << "请输入数据:" << endl;
for(int i = 0;i != n;i++)
{
cin >> k;
if(cin.fail())
{
cout<<"输入非法,请重新输入!"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
}
a.push_back(k); //保存数据
}
t1 = gcd(a[0],a[1]);//对向量第0,1元素求最大公约数
for(size_t i=2;i!=a.size();++i)
//求最大公约数t1与向量数组其它元素的最大公约数
{
t1 = gcd(a[i],t1);
}
t2=lcm(a[0],a[1]);//对向量第0,1元素求最小公倍数
for(size_t i=2;i!=a.size();++i)
//求最小公倍数t2与向量数组其它元素的最小公倍数
{
t2=lcm(a[i],t2);
}
cout<<"最大公约数为:"<<t1<<endl; //输出结果
cout<<"最小公倍数为:"<<t2<<endl;
a.clear(); //清除向量a内容,避免影响下次输入
cout<<endl;
cout<<"是否继续输入?"<<endl;//判断是否继续计算
cout<<"1.是"<<" "<<"2.否"<<endl;
cin>>c;
if(c==1)
cout << "请输入所要求的数据的个数:";
else
break;
}
return 0;
}
四、调试、测试及运行结果
1、调试
(1)开始调试。
(2)输入如下数据。
(3)求出最大公约数。
(4)求出最小公倍数。
(5)输出结果。
结果为:
2、测试——判断是否非法输入
测试代码:
cin >> k;
if(cin.fail())
{
cout<<"输入非法,请重新输入!"<<endl;
cin.clear(); //清除流标记
cin.sync(); //清空流
}
a.push_back(k); //保存数据
结果截图:
3、运行结果
五、经验归纳
1、自动增长的对象数组
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
简单的使用方法如下:
vectortest;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector这样test[0]就是1,test[1]就是2。
2、c++中,定义了一个整型变量price,用来判读输入的price是否是整型变量的方法。