1、 题目:
求N个数的最大公约数和最小公倍数。
2、 算法设计:
求n个数的最大公约数:
第一步:将n个数存放在数组a[n]中;
第二步:写出求两个数的最大公约数的函数gcd;
第三步:求a[0]和a[1]的最大公约数,result=gcd(a[0],a[1]);
第四步:求a[0]~a[2]最大公约数,result=gcd(a[result,a[2]);
第五步:依次类推,求出a[0]~a[n-1]的最大公约数;
第六步:返回result;
求n个数的最小公倍数:
第一步:将n个数存放在数组a[n]中;
第二步:写出求两个数的最大公约数的函数gcd;
第三步:求a[0]和a[1]的最大公约数,result=gcd(a[0],a[1]);
第四步:求a[0]和a[1]的最小公倍数,num=a[0]*a[1]/result;
第五步:依此类推,两两求取最小公倍数;
第六步:返回num;
3、 源程序
#include<stdio.h>
int gcd(int a,int b) //求两个数的最大公约数
{
int temp;
temp=(a>b?b:a);
while(temp)
{
if(a%temp==0&&b%temp==0)
{
break;
}
temp--;
}
return (temp);
}
int max_gcd(int array[],int n) //求n个数的最大公约数
{
int i,x,y, result;
x=array[0];
y=array[1];
result=gcd(x,y); //调用函数gcd先求出前两个数的最大公约数
for(i=2;i<n;i++) //依次两两求出最大公约数
{
result=gcd(result,array[i]);
}
return (result);
}
int min_multiple(int array[],int n) //求n个数的最小公倍数
{
int x,y,result,num;
num=array[0];
for(int i=1;i<n;i++) //依次两两求出最小公倍数
{
x=num;
y=array[i];
result=gcd(x,y); //调用函数gcd先求两个数的最大公约数
num=x*y/result; //在计算两个数的最小公倍数
}
return (num);
}
int main()
{
int n,a[100];
printf("请输入要求最大公约数的正整数个数:\n");
scanf("%d",&n);
printf("请输入%d个数字: \n",n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]<0)
{
printf("请重新输入第%d个数:\n",i+1);
scanf("%d",&a[i]);
}
}
printf("这%d个数的最大公约数是%d\n",n,max_gcd(a,n));
printf("这%d个数的最小公倍数是%d\n",n,min_multiple(a,n));
return 0;
}
4、 程序调试及测试
程序测试截图
程序输入数据正确性验证测试截图
程序调试截图
5、 总结体会
本次题目是求n个数的最大公约数和最小公倍数,之前的作业中做过求两个数的最大公约数和最小公倍数,这次的作业在之前作业的基础上使用了多次函数调用实现程序的完成。可以发现,函数调用可以减少代码量,提高程序的可读性。本次作业遇到的难点是多个数求最小公倍数,刚开始我想把所有数相乘再除以它们的最大公约数,但是这种方法不能实现,最后我采用两两数调用gcd函数求最小公倍数的方法完成了题目。本次作业让我体会到了使用调用简化程序的方便之处,希望以后能合理、巧妙的使用此方法。