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

2 篇文章 0 订阅
1 篇文章 0 订阅

一、题目名称:求多个数的最大公因数

二、算法设计:

1.输入数据
2.将数据用冒泡法由小到大排序;
3.将最小的数赋值给b;
4.判断是否所有的数是否能够整除b;
5.如果不能整除,b自减;
6.如果所有数都能整除b,那么b为这些数的最大公因数;

三、算法流程图:

最大公因数
在这里插入图片描述
最小公倍数
在这里插入图片描述

四、代码部分

#include<stdio.h>
#include<stdlib.h>


void get_number(int array[],int b)             //用来获取数据
{
	
	int i=0;
	
	for (i=0;i<=b-1;i++)
	{
		printf("请输入第%d个数:",i+1);
		scanf("%d",&array[i]);
		while(array[i]<=0)
		{
			printf("请输入正整数\n");
			scanf("%d",&array[i]);
		}
	}
	printf("输入成功\n");
	printf("\n");

}

void BubbleSort(int array[],int n)
{
	int i,j,temp;                    //外循环控制循环趟数

	 for(i=0; i<n-1; i++)             //内循环选择要进行比较的数
	{

		for(j=0; j<n-1-i; j++)
		{
		   if(array[j]>array[j+1])
		   {
			temp=array[j];
			array[j]=array[j+1];
			array[j+1]=temp;
		   }
		}
	}
	printf("排序后的这几个数:");
	for(i=0;i<n;i++) 
	{
		printf("\t%d",array[i]);
	}
	
	
}

void manage(int array[],int b)                  //求取最大公因数
{
	int e; 
	e=array[0];
	int c=1;
	int d=0;
	int f;
	f=array[b-1];
	while(c!=0)
	{
		c=0;
		for(d=0;d<b;d++)
		{
			if(array[d]%e==0)
			{
				c+=0;
		
			}
			else
			{
				c+=1;
			}
		}
		if(c!=0)	e--;
	}
	printf("\n");
	printf("\n这几个数的最大公因数为:\t%d\n",e);

	c=1;
	while(c!=0)
	{
		c=0;
		for(d=0;d<b;d++)
		{
			if(f%array[d]==0)
			{
				c+=0;
		
			}
			else
			{
				c+=1;
			}
		}
		if(c!=0)	f++;
	}
	printf("\n这几个数的最小公倍数为:\t%d\n\n\n\n",f);



	
}

	



void home()
{
	int a[50];
	int b;

	printf("求最大n个数的最大公因数");
	printf("\n");
	printf("请输入你要得到几个数的最大公因数:");
	scanf("%d",&b);
	get_number(a,b); 
	BubbleSort(a,b);  
	manage(a,b);         
}

int main()
{
	while(1)
	{
		home();
	}
	system("pause");
	return 0;
}


五、运行结果截图

1、正常运行
在这里插入图片描述
2、输入不正确的数后
在这里插入图片描述

六、测试部分

测试不同个数在程序运行下的最大公因数和最小公倍数
利用随机数函数生成n个随机数并且输入到数组中,求取数组中的数的最大公因数和最小公倍数。
随机数的范围:1~dis;
随机数个数:n;

#include<stdio.h>
#include<stdlib.h>
#define Random(x) (rand() % x) //通过取余取得指定范围的随机数

void get_number(int array[],int b)
{
		
        int i;
        int dis;       //产生[0, dis)之间的随机数,注意不包括dis  
		printf("请输入随机数范围最大界限:");
		scanf("%d",&dis);      
        for(i=0; i<b; i++)
        {   
        	array[i]=Random(dis)+1; 
        }
       
} 

void BubbleSort(int array[],int n)
{
	int i,j,temp;                    //外循环控制循环趟数

	 for(i=0; i<n-1; i++)             //内循环选择要进行比较的数
	{

		for(j=0; j<n-1-i; j++)
		{
		   if(array[j]>array[j+1])
		   {
			temp=array[j];
			array[j]=array[j+1];
			array[j+1]=temp;
		   }
		}
	}
	printf("排序后的这几个数:");
	for(i=0;i<n;i++) 
	{
		printf("\t%d",array[i]);
	}
	
	
}

void manage(int array[],int b)                  //求取最大公因数
{
	int e; 
	e=array[0];
	int c=1;
	int d=0;
	long int f;
	f=array[b-1];
	while(c!=0)
	{
		c=0;
		for(d=0;d<b;d++)
		{
			if(array[d]%e==0)
			{
				c+=0;
		
			}
			else
			{
				c+=1;
			}
		}
		if(c!=0)	e--;
	}
	printf("\n");
	printf("\n这几个数的最大公因数为:\t%d\n",e);

	c=1;
	while(c!=0)
	{
		c=0;
		for(d=0;d<b;d++)
		{
			if(f%array[d]==0)
			{
				c+=0;
		
			}
			else
			{
				c+=1;
			}
		}
		if(c!=0)	f++;
	}
	printf("\n这几个数的最小公倍数为:\t%d\n\n\n\n",f);

	
}


void home()
{
	int a[50];
	int b;

	printf("求最大n个数的最大公因数");
	printf("\n");
	printf("请输入你要得到几个数的最大公因数:");
	scanf("%d",&b);
	get_number(a,b); 
	BubbleSort(a,b);  
	manage(a,b);         
}

int main()
{
	while(1)
	{
		home();
	}
	system("pause");
	return 0;
}




测试结果:
1~20之间的随机数
2~5之间的数字量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1~40之间的随机数
2~5之间的数量个数

在这里说明一下,测试的随机数是伪随机数,但是由于输入的数量数目的不同,就可以解决伪随机数这个问题。虽然这个获取随机的函数方法是更具环境来决定的,但是我们在获取随机数的时候只要有一处是采用了随机的方法,我们便获取了随机数。本次测试便是如此。通过变换想要取得数量的个数以及范围的大小,获得随机数。

这里也建议采用本次测试的方法的同学们,尽量将随机数个数和范围调小一点,不然计算机获取时间过长。

七、出现问题及心得体会

这次作业,本来感觉是比较简单的,但是整体实践下来,发现还是有不少问题对于现在的我来说还是比较困难的,自己的动手能力比较差,有些想法的实施缺乏经验,应该多加练习。
遇到的第一个问题就是我在确定好我的思路后,没有模块化我的完成过程。所以我在第一遍完成我的代码时,出错了,却无法具体到某一部分,先对于繁杂的检查过程,我发现还是从新设计一下我的思路,将处理过程模块化,然后分布进行。这样在检查的过程中能够很好地检查错误,更能高效的完成处理过程。
遇到的第二个问题便是我的核心处理过程。穷举法的思路出现了问题。还是过于自信,对于之前的2个数的最大公因数,我感觉很简单,但是发现实施还是有点困难。这次的多个数的最大公因数,需要解决的问题更多。
原先代码:

BubbleSort(a,i);  //冒泡法由小到大排序
	b=a[0];    //取最小的数

	while(c==0)
	{
		for(d=0;d<i;d++)
		{
			if(a[d]%b==0)
			{
				c=0;
			//	d++;
			}
			else
			{
				c=1;
			//	break;
			}
		}
		b--;

}
改进后代码:

	while(c!=0)
	{
		c=0;
		for(d=0;d<b;d++)
		{
			if(array[d]%e==0)
			{
				c+=0;
		
			}
			else
			{
				c+=1;
			}
		}
		if(c!=0)	e--;
	}

这前后的改进过程我发现一个清晰的程序设计图是多么重要。
本次实验我是采用数组的方式储存数据,然后用冒泡法进行排序,取组头最小数求最大公因数和去组尾求最小公倍数。但是从时间复杂度来说,利用这种排序法进行排序,然后利用穷举法求最大公因数和最小公倍数,不一定比我不给数组排序,直接从数组里面获得一个数实现穷举法获得结果要优化的多。我本想采用更加节省空间和时间的排序方法,但是回过头复习之前的课文,发现没有把它好好学到自己的脑子里面。平成作业应该要求自己用多种方法实现,及时发现自己在学习上的不足,然后快速补充。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值