基本要求

一,题目分析及算法思路
本次我用c语言实现了辗转相除法来计算n个数的最大公约数和最小公倍数。算法思路如下:(1)先求出两个数的最大公约数,先比较找出两个数的最大值和最小值,最小值不为零进入循环,通过循环求两个数的余数,直到余数为0,那么最后一个除数就是两个数的最大公约数。(2)然后求n个数的最大公约数,就是将前两个数的最大公约数与第三个数求最大公约数,依次到最后一个数为止,这样最后一个最大公约数就是这n个数的最大公约数。(3)利用两个数的最大公约数求出两个数的最小公倍数,然后依次与后一个数求最小公倍数,最后一个最小公倍数就是这n个数的最小公倍数。

  1. 异常处理模块
    因为最小公倍数的计算值中不能含有零,否则无效。所以添加了判断输入计算值是否含有零的判断函数。
/*判断函数,判断计算值中是否有0*/
int judge(int t[],int n)
{
	int i;
	for(i=0;i<n;i++)					   /*通过循环判断计算值中是否有0*/
	{
		if (t[i]==0)					   /*判断计算值是否等原因0*/
		{ 
			printf("输入数含0,请重新输入。\n");
			return 1;
		} 
	}
	return 0;
}
  1. 输入函数
    因为要计算n个函数的最大公约数和最小公倍数,所以输入数值的个数大于等于二。循环输入计算值和调用判断函数。
/*输入函数*/
int input(int t[])
{
	int i,n;
	int k=1;
	printf("请输入所计算值的数目(n>=2):"); /*输入计算值个数*/
	scanf("%d",&n);
	if (n<2)						        /*判断输入错误*/
	{
		printf("输入错误,请重新输入。\n");
		return input(t);				    /*重新输入*/
	} 
	while (k)						        /*当k=1时进入循环*/
	{ 
		printf("输入计算值:\n");
		for (i=0;i<n;i++)				    /*进入循环,输入计算值*/
		{
			scanf("%d",&t[i]); 
		}
		k=judge(t,n);					    /*调用判断函数,跳出循环*/
	}
	return n;							    /*返回计算值个数*/
}
  1. 求最大公约数
    先求出两个数的最大公约数,再求n个数的最大公约数。
/*求两个数最大公约数函数*/
int gcd(int a,int b)        /*自定义函数求两数的最大公约数*/
{
	int  temp;              /*定义整型变量*/
	if(a<b)                 /*通过比较求出两个数中的最大值和最小值*/
	{ 
		temp=a;
		a=b;
		b=temp;
	}						/*设置中间变量进行两数交换*/
	while(b!=0)             /*通过循环求两数的余数,直到余数为0*/
    {
        temp=a%b;
        a=b;                /*变量数值交换*/
        b=temp;
    }
    return (a);             /*返回最大公约数到调用函数处*/ 
}
/*求n个数最大公约数函数*/
int Gcd(int t[],int n)      /*自定义数组函数求n个数的最大公约数*/
{
	int i;				    /*定义整型变量*/
	int c=t[0];			    /*定义整形变量存储第一个数*/
	for (i=1; i<n; i++)     /*通过循环求出n个数最大公约数*/
	{ 
		c=gcd(c,t[i]);		     /*调用求两个数的最大公约数的函数*/
	} 
    return c;			    /*返回最大公约数到调用函数处*/
}
  1. 求最小公倍数
    先求出两个数的最小公倍数,再求出n个数的最小公倍数。
/*求两个数最小公倍数函数*/
int lcm(int a,int b)	    /*自定义函数求两数的最小公倍数*/
{
    int gcd(int a,int b);   /*自定义函数返回值类型*/
	int temp;
	temp=gcd(a,b);	   	    /*再次调用自定义函数,求出最大公约数*/
	return  (a*b/temp);	    /*返回最小公倍数到主调函数处进行输出*/
}

/*求n个数最小公倍数函数*/
int Lcm(int t[],int n)      /*自定义数组函数求n个数的最小公倍数*/
{
	int i;					
	int s=t[0];				
	for (i=0;i<n;i++)
	{
		s=lcm(s,t[i]);	    /*调用求两个数的最小公倍数的函数*/
	}
	return s;			    /*返回最小公倍数到调用函数处*/
}

  1. 主函数
/*主函数*/
void main()
{
	int t[N];							    /*定义计算值数组*/
	int n;								    /*定义数据个数*/
	int flag=1;
	while (flag)                            /*为1继续输入*/
	{
		n=input(t);
		printf("最大公约数为 %d\n",Gcd(t,n));  /*输出Gcd函数返回值,最大公约数*/
		printf("最小公倍数为 %d\n",Lcm(t,n));  /*输出Lcm函数返回值,最小公倍数*/
		printf("退出请按0,继续请按1 :");
		scanf("%d",&flag);
	}
}

二,调试,测试及输出结果
判断函数
输入函数中对于计算值多少的判断
求n个数最大公约数
求n个数最小公倍数
最终测试结果
三,经验总结归纳
因为做过求两个数最大公约数的算法设计,所以知道好几种方法可以求得最大公约数和最小公倍数,这次我应用了辗转相除法中的嵌套调用来实现。通过解决此问题让我更加明白了编写代码的严谨性,在异常处理模块中编辑了输入计算值不能为0后,不足的是,我又考虑到输入的计算值应为正数,如果输入负数应该报错,但这次并没有写进代码中。以前都是把所有的代码全部写在主函数中,这次定义了很多函数来独立完成各自的功能,使我明显感觉到了这样代码的易读性和方便。这次的学习用了许多for语句和while语句,使我更完全的掌握了这些语句的用法,希望在后面的编程中可以灵活的应用出来。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值