基本要求
一,题目分析及算法思路
本次我用c语言实现了辗转相除法来计算n个数的最大公约数和最小公倍数。算法思路如下:(1)先求出两个数的最大公约数,先比较找出两个数的最大值和最小值,最小值不为零进入循环,通过循环求两个数的余数,直到余数为0,那么最后一个除数就是两个数的最大公约数。(2)然后求n个数的最大公约数,就是将前两个数的最大公约数与第三个数求最大公约数,依次到最后一个数为止,这样最后一个最大公约数就是这n个数的最大公约数。(3)利用两个数的最大公约数求出两个数的最小公倍数,然后依次与后一个数求最小公倍数,最后一个最小公倍数就是这n个数的最小公倍数。
- 异常处理模块
因为最小公倍数的计算值中不能含有零,否则无效。所以添加了判断输入计算值是否含有零的判断函数。
/*判断函数,判断计算值中是否有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;
}
- 输入函数
因为要计算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; /*返回计算值个数*/
}
- 求最大公约数
先求出两个数的最大公约数,再求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; /*返回最大公约数到调用函数处*/
}
- 求最小公倍数
先求出两个数的最小公倍数,再求出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; /*返回最小公倍数到调用函数处*/
}
- 主函数
/*主函数*/
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);
}
}
二,调试,测试及输出结果
三,经验总结归纳
因为做过求两个数最大公约数的算法设计,所以知道好几种方法可以求得最大公约数和最小公倍数,这次我应用了辗转相除法中的嵌套调用来实现。通过解决此问题让我更加明白了编写代码的严谨性,在异常处理模块中编辑了输入计算值不能为0后,不足的是,我又考虑到输入的计算值应为正数,如果输入负数应该报错,但这次并没有写进代码中。以前都是把所有的代码全部写在主函数中,这次定义了很多函数来独立完成各自的功能,使我明显感觉到了这样代码的易读性和方便。这次的学习用了许多for语句和while语句,使我更完全的掌握了这些语句的用法,希望在后面的编程中可以灵活的应用出来。