一、 题目分析
求N个数的最大公约数和最小公倍数。
二、 算法构造
三、 算法实现
#include <iostream>
using namespace std;
int divisor(int a,int b);
int ndivisor(int *a,int n);
int multiple(int a,int b);
int nmultiple(int *a,int b);
int main()
{
cout<<"请选择计算的数据数量:"<<endl;
int n;
cin>>n;
while(cin.fail()){
cout<<"Wrong, you have inputed a wrong type data\n"<<endl;
cin.clear();//清除错误标记,重新打开输入流,但是输入流中依旧保留着之前的不匹配的类型
/*cin.sync();*///清除cin缓存区的数据。
while(cin.get() != '\n'){
continue;
}
cout<<"please input again"<<endl;
cin>>n;
}
cout<<"请输入"<<n<<"个数据:"<<endl;
int a[n];
for(int m=0;m<n;m++)
cin>>a[m];
int div=ndivisor(a,n);
int mul=nmultiple(a,n);
cout<<"上述"<<n<<"个数字的最大公约数为:"<<div<<endl;
cout<<"上述"<<n<<"个数字的最小公倍数为:"<<mul<<endl;
return 0;
}
int divisor(int a,int b)//两个数求最大公约数
{
int temp;
if(a<b)
{
temp=a;
a=b;
b=temp;
}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
int ndivisor(int *a,int n)//n个数求最大公约数
{
if(n==1)
return(*a);
return divisor(a[n-1],ndivisor(a,n-1));
}
int multiple(int a,int b)//求最小公倍数
{
int divisor(int a,int b);
int temp=divisor(a,b);
return(a*b/temp);
}
int nmultiple(int *a, int n)//求n个数的最小公倍数
{
if (n == 1)
return *a;
else
return multiple(a[n-1], nmultiple(a, n-1));
}
四、 测试、调试及运行过程
1) 测试调试
2) 运行
五、 经验总结
1、 学习了如何反复输入直至正确,既输入流相关的使用、打开与关闭输入流与清除cin输入区的数据
2、 再次复习了最大公约数的算法,主要复习了它的递归调用法,并且在这次作业中学习了反复调用该算法实现多个数的最大公约数