一、题目名称:求N个数的最大公约数和最小公倍数
二、算法设计:
基本要求:
1.构造辗转相除法来求两个数的最大公约数的函数;
2.构造根据求最大公约数来求两个数的最小公倍数的函数;
3.根据公式,可以知道两个数a,b的乘积等于他们的最大公约数和最小公倍数的积,所以假设他们的最大公约数为c,最小公倍数是d,则d=a*b/c.
4.构造求n个数的最大公约数的函数和最小公倍数的函数
方法是for循环调用gcd()和lcm()函数求n个数的最大公约数和最小公倍数。
5.在主函数中调用ngcd()和nlcm()函数。
6.输出所求的最大公约数和最小公倍数。
三、流程图
五、运行结果
源代码如下:
#include"stdio.h"
#include"stdlib.h"
#pragma warning(disable:4996)//scanf函数错误忽略
#define N 100
int gcd(int a, int b) //辗转相除法求两个数的最大公约数
{
int temp;
if (a<b){
temp = a;
a = b;
b = temp;
}
if(b == 0) { return a; }
return gcd(b,a%b);
}
int lcm(int a, int b) //根据最大公约数来求两个数的最小公倍数
{
return (a*b / gcd(a,b));
}
int ngcd(int max[], int n) //求n个数的最大公约数
{
int a = max[0];
int b = max[1];
int c = gcd(a, b);
for (int i = 2; i<n; i++){
c = gcd(c, max[i]);
}
return c;
}
int nlcm(int min[], int n) // 求n个数的最小公倍数
{
int a = min[0];
int b = min[1];
int c = lcm(a, b);
for (int i = 2; i<n; i++){
c = lcm(c, min[i]);
}
return c;
}
int main()
{
int a[N];
int i = 0;
int j = 0;
printf("请输入要求最大公约数和最小公倍数的个数: \n");
scanf("%d", &j);
printf("请输入要求最大公约数和最小公倍数的数字: \n");
for (i; i < j; i++){
scanf("%d", &a[i]);
}
printf("最大公约数为%d\n", ngcd(a, j));
printf("最小公倍数为%d\n", nlcm(a, j));
system("pause");
return 0;
}