C语言_求n个数的最大公约数和最小公倍数

一、题目名称:求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;
}

猜你喜欢

转载自blog.csdn.net/qq_45915957/article/details/105233327