题目分析:
实现n个数的最大公约数和最小公倍数,可以让前两个数比较,比较后得到的数标记或者存储再与第三个数比较。
算法构造:
算法实现:
#include<stdio.h>
#include<malloc.h>
int divisor (int a,int b) /*自定义函数求两数的最大公约数*/
{
int temp; /*定义整型变量*/
if(a<b) /*通过比较求出两个数中的最大值和最小值*/
{ temp=a;a=b;b=temp;} /*设置中间变量进行两数交换*/
while(b!=0) /*通过循环求两数的余数,直到余数为0*/
{
temp=a%b;
a=b; /*变量数值交换*/
b=temp;
}
return (a); /*返回最大公约数到调用函数处*/
}
int multiple (int a,int b) /*自定义函数求两数的最小公倍数*/
{
int divisor (int a,int b); /*自定义函数返回值类型*/
int temp;
temp=divisor(a,b); /*再次调用自定义函数,求出最大公约数*/
return (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/
}
int main()
{
//p用于存储n个数
int *p;
int max_cd;
int min_cd;
int n;
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
scanf("%d",p+i);
//先求两个数的最大公约数再依次求n个数的
max_cd=divisor(*p,*(p+1));
for(int k=2;k<n;k++)
{
max_cd=divisor(max_cd,*(p+k));
}
//求最小公倍数
min_cd=multiple(*p,*(p+1));
for(int j=2;j<n;j++)
{
min_cd=multiple(min_cd,*(p+j));
}
printf("%d %d \n",max_cd,min_cd);
getchar();
return 0;
}