求N个数的最大公约数和最小公倍数+Hankson的“逆问题”

##求N个数的最大公约数和最小公倍数+Hankson的“逆问题”
(一) 题目求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。提高要求:Hankson的“逆问题”

(二)程序代码
//title:求N个数的最大公约数及最小公倍数
//author: qiuerduoer
#include < iostream >
using namespace std;
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 multiple (int a,int b) /自定义函数求两数的最小公倍数/
{ int divisor(int a,int b);
int temp;
temp=divisor(a,b);
return (ab/temp);
}
int main()
{ int t1,t2;
int h;
cout<<“请输入数组元素个数:”<<endl;
cin>>h;
int array=new int[h];//建立数组
cout<<“请输入要求最大公约数和最小公倍数的数:”<<endl;
//赋值
for(int i=0;i<h;i++)
{
cin>>array[i];
}
cout<<"1.求最大公约数
*2.求最小公倍数
"<<endl;
int a;
cout<<“请选择:”;
cin>>a;
switch(a)
{
case 1:
for(i=0;i<h-1;i++)
{
t1=divisor(array[i],array[i+1]);
array[i+1]=t1;
}
cout<<“最大公约数为:”<<t1<<endl;
break;
case 2:
for(i=0;i<h-1;i++)
{
t2=multiple(array[i],array[i+1]);
array[i+1]=t2;
}
cout<<“最小公倍数为:”<<t2<<endl;
break;
}
cout<<endl;
cout<<“计算Hankson的逆问题”<<endl;
int n, a0,a1,b0,b1;
cout<<“请输入数据组数:”;
cin>>n;
while(n)
{
int sum=0;
cout<<“请输入a0 a1 b0 b1:”<<endl;
cin>>a0>>a1>>b0>>b1;
for( int x=a1;x<=b1;x++)
{
if( divisor(x,a0)==a1 && multiple(x,b0)==b1)
sum++;
}
cout<<“符合条件的x个数为:”<<sum<<endl;
n–;
}
return 0;
}
`
(三)调试及测试结果
调试:在编写该程序的时候出现的最大的错误就是这个,改正:就是先求出的最大公约数(最小公倍数)要赋值给a[i+1];而不是a[i]求N个数的最大公约数和最小公倍数+Hankson的“逆问题”
求N个数的最大公约数和最小公倍数+Hankson的“逆问题”
运行结果:
求N个数的最大公约数和最小公倍数+Hankson的“逆问题”求N个数的最大公约数和最小公倍数+Hankson的“逆问题”
求N个数的最大公约数和最小公倍数+Hankson的“逆问题”
(四)心得
由于上次上机实验写过求两个数的最大公约数,所以求N个数的最大公约数和最小公倍数较容易一点吧,就是首先得搞懂该如何计算,然后再进行编写程序,不然就会出现许多小问题;Hanskon的逆问题看起来一大串,很难搞懂,刚开始把它当成了复杂的数学问题,还查阅了最小公倍数和最大公约数间的关系,也看了很多人的解决方法,觉得很难,后来发现只要根据题目中给出的条件写出代码即可,所以许多问题我们应该把它简单化,而不是复杂化。