求n个数的最大公因数和最小公倍数

     这篇用三种方法求n个数的最大公因数,两种方法求n个数的最小公倍数

一.代码的完成

//求最大公因数和最小公倍数
//功能:用三种方法实现求n个数之间的最大公因数,两种方法求n个数之间的最小公倍数
//语言:C++
//作者:软工1502班 贺雪1508010208
//时间:2017年3月18日


#include
using namespace std;

//短除法
int Sd_gcd(int num1,int num2,int p)  //p为返回值选择标识符
{
    int maxDiv = 1;   //最大公因数赋初值
    for(int i = 2; i <= num1; i ++)   //2为最小质数
    {
        while((num1 % i == 0) && (num2 % i == 0))  //求两个数的公共因数
        {
            maxDiv = maxDiv * i;   //公共因数相乘
            num1 = num1 / i;
            num2 = num2 / i;
        }
    }
    if(p==1)
		return maxDiv;
	else
		return maxDiv * num1 * num2;
}

//相减法
int Se_gcd(int num1,int num2)
{
	int maxDiv = 1;  //最大公因数赋初值
	int i=1;
	while(i!=0&&num1-num2!=0)  //差等于0结束,maxDiv为等于零前一个值
	{
		if(num1>num2)        //大的减去小的
			i=num1-num2;
		else
			i=num2-num1;
		maxDiv = i;     //差赋给因数
		if(num1>i)       //交换位置,始终保持大的减小的
			num1=i;
		else
			num2=i;
	}
		return maxDiv;
}

//辗转相除法
int Ea_gcd(int num1,int num2)
{
    int maxDiv = 1;     //最大公因数赋初值
    int Rem;   //余数
    while(num2 > 0)
    {
        Rem = num1 % num2;
        num1 = num2;
        num2 = Rem;
    }
	return num1;
}

int main()
{
	int m=1;  //m为选择标识
	int a[10000];  //定义足够大的空间
	cout<<"求最大公约数和最小公倍数"<>p;
		if(p==1)  //求最大公因数
		{
			cout<<"输入的整数的个数:";
	        cin>>n;
	        cout<<"输入数字:";
			for(int j=0;j>a[j];
			}
			//前两个数进行比较
			maxDiv1 = Sd_gcd(a[0],a[1],p);   //短除法
			maxDiv2 = Se_gcd(a[0],a[1]);   //相减法
			maxDiv3 = Ea_gcd(a[0],a[1]);   //辗转相除法
	        cout<>m;
			cout<>n;
	        cout<<"输入数字:";
			for(int j=0;j>a[j];
			}


			//最小公倍数等于短除法所有质数相乘,即最大公因数乘两数剩余的两个质数
			minMul = Sd_gcd(a[0],a[1],p);  
			for(j=2;j>m;
			cout<

二.运行截图(改进过程)

第一步
只求两个数的最大公因数:

求n个数的最大公因数和最小公倍数_第1张图片


第二步:
求两个数的最大公因数和n个数的最小公倍数:
求n个数的最大公因数和最小公倍数_第2张图片

第三步
求出了n个数的最大公因数和n个数的最小公倍数:

求n个数的最大公因数和最小公倍数_第3张图片

三.个人总结

    

    这次的作业完成的速度比较快,首先,完成了对于两个数之间求最大公因数的计算,然后拓展了对于n个数求最小公倍数,接着改良了公因数,改为可以求n个数的最大公因数和n个数的最小公倍数。

  这次作业对于数学的要求比较高,对于如何求最大公因数最小公倍数的方法,我只局限于以前学习的简单的方法,没想到有很多很多,辗转相除法、相减法等等,对于数学的积累太薄弱是自己的一大弱点,所以对于要用三种方法求最大公因数和最小公倍数,我还在网上找了求证的方法,才补充了知识盲点。

  在编程过程中,对于求两个数之间的公因数和公倍数,都比较简单,但是拓展到n个的时候,就遇到了障碍,一开始总是想着怎么能直接对于n个数的比较,运用数组,直接用a[j]a[j+1]进行比较,然后j++,运行后发现,如果直接j++,在a[j]a[j+1]计算后,a[j+2]又和a[j+1]重复计算,逻辑完全错误,所以这种想一步登天的想法太可笑,最后先把第一个数和第二个计算出结构后,用结果去和j+1计算,就可以避免重复的后果,克服了这个问题以后,我完成了求n个数的最小公倍数,于是便试着将求最大公因数的功能也扩展到可以同时求n个数的,最终完成了对n个数求最大公因数和最小公倍数的程序,但是对于对输入数据正确性的验证,却没有完善。

   这是最基础的ACM题,以后要自己多找题练习,加强自己的逻辑计算能力。


你可能感兴趣的:(求n个数的最大公因数和最小公倍数)