求n个数的最大公约数及最小公倍数

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函数求最小公倍数的方法完成了题目。本次作业让我体会到了使用调用简化程序的方便之处,希望以后能合理、巧妙的使用此方法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值