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