一、题目分析
求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。
本次作业利用辗转相除法来对n个数求最大公约数和最小公倍数。
1、求两个数的最大公约数
其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数
①大数放a中、小数放b中;
②求a/b的余数;
③若temp=0则b为最大公约数;
④如果temp!=0则把b的值给a、temp的值给a;
⑤返回a值。
2、求n个数的最大公约数
其算法过程为:前提:设两个数i、c
①令c=t[0] (即数组内第一个数);
②设一个对于t[i]的循环,从i=1开始调用gcd函数令c与t[1]进行求两个数的最大公约数的操作,将其求出来的值赋给c,如此循环···
③当数组内所有值都计算结束时返回c值。
3、求两个数的最小公倍数
利用求最大公约数的函数,直接返回求出a*b/gcd(a,b)的值。
4.求n个数的最小公倍数
与求n个数的最大公约数思想相似,即先求前两个数的最小公倍数,然后将计算出来的值与下一个数进行求最小公倍数的操作,当数组内所有值运算结束后,返回最终的值。
二、算法设计
求两个数最大公约数的流程图
三、算法实现
/*用辗转相除法求n个数的最大公约数及最小公倍数*/
#include <stdio.h>
#define N 10000 /**定义数组长度,自定义**/
/**输入函数,输入个数和计算数,参数为输入数组**/
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)
{
printf("输入计算值:\n");
for(i=0;i<n;i++)
{
scanf("%d",&t[i]);
}
k=exper(t,n);
}
return n;
}
/*验证函数,验证输入值是否有0*/
int exper(int t[],int n)
{
int i;
for(i=0;i<n;i++)
{
if (!t[i])
{
printf("输入数含0,错误!!!\n");
return 1;
}
}
return 0;
}
/**求两个数的最大公约数**/
int gcd(int a,int b)
{
int temp;
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
/**求n个数的最大公约数**/
int Gcd(int t[],int n)
{
int i;
int c=t[0];
for (i=1; i<n; i++)
{
c=gcd(c,t[i]);
}
return c;
}
/**求两个数的最小公倍数**/
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
/**求n个数的最小公倍数**/
int Lcm(int t[],int n)
{
int i;
int s=1;
for (i=0;i<n;i++)
{
s=lcm(s,t[i]);
}
return s;
}
/**主函数**/
int 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);
}
return 0;
四、运算结果
(1)输入值含0时
(2)输入数目为1时
(3)输入数目大于一时并不含0时
五、心得体会
通过这次课题发现自己的编程基础有些不牢靠,比如对于数组的循环输入并未掌握,对0值的测试表达不准确等,还会犯一些小错误,所以之后希望能加以改正,有所进步。