程序设计作业
题目:求N个数的最大公约数和最小公倍数。
分析:求多个数的问题可以转换成多个两个数之间的问题,利用随机函数产生多个数保存在数组中,然后先求出前两个数的最大公约数(最小公倍数),然后用求出的数再和下一个进行运算,就这样一直运算下去,结果就出来了。
流程图:
调试过程:
产生随机数20个:
20个数的最小公倍数:
20个数的最大公约数:
运行结果:
源代码:
#include <stdio.h>
#include<time.h>//时间函数,获得时间信息的函数
#include<stdlib.h>//随机数生成函数
#include<math.h>//数学函数,程序后面用于计算次方
#define N 20
//获取两个数的最大公约数
int GCD(int a,int b)
{
int temp;
if(a < b)
{
temp = a;
a = b;
b = temp;
}
if(a%b == 0)
return b;
else
return GCD(b,a%b);
}
//获得多个数的最小公倍数
int min(int* arry,int size)
{
int x,y,num=arry[0],i,gcd; //取数组的第一和第二个数,计算它们的公倍数,然后再取第三个数, 和之前的公倍数计算它们的公倍数,直到只有一个数。
for(i=0;i<size;i++)
{
x=arry[0];
y=arry[i+1];
//计算公约数
gcd = GCD(x,y);
//计算公倍数
num = x/gcd * y/gcd * gcd;
}
return num;
}
//计算多个数的最大公约数
int max(int *arry,int size)
{
int gcd1=0;
int i=0;
int o=0;
while(i<size)
{
gcd1=GCD(arry[i],arry[++i]);
o=GCD(gcd1,arry[++i]);
}
return o;
}
void main()
{
int i,arry[N];//产生随机数,保存在数组中
srand(time(0));//产生随机数
printf("产生的随机数为:");
for(i=0; i<N; i++)
{
arry[i] = rand()%500;
printf("%d ",arry[i]);
}
printf("\n");
printf("20个随机数的最小公倍数为:\n");
int a = min(arry,N);
printf("%d\n",a);
printf("20个随机数的最大公约数为:\n");
int m = max(arry,N);
printf("%d\n",m);
}