一、算法设计思路:
辗转相除法
辗转相除法(又名欧几里德法)C语言中用于计算两个正整数a,b的最大公约数和最小公倍数,采用函数嵌套调用形式进行求两个数的最大公约数和最小公倍数,叙述如下:
函数嵌套调用
其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数
1、大数放a中、小数放b中;
2、求a/b的余数;
3、若temp=0则b为最大公约数;
4、如果temp!=0则把b的值给a、temp的值给a;
5、返回第二步;
源代码:
#include "stdio.h" /*输入输出类头文件*/
#define MAX 100 /*数组最大长度*/
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 getDivisor(int *array,int n)
{
int i,x,y;
int ditemp;
ditemp=array[0];//**************************************
for(i=0;i<n-1;i++)
{
x=ditemp;
y=array[i+1];
ditemp=divisor(x,y);
}
return (ditemp);
}
int multiple(int a,int b) /*自定义函数求两数的最小公倍数*/
{
int divisor (int a,int b); /*自定义函数返回值类型*/
int temp;
temp=divisor(a,b); /*再次调用自定义函数,求出最大公约数*/
return (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/
}
int getMultiple(int *array,int n)
{
int i,x,y;
int mutemp;
mutemp=array[0];//**************************************
for(i=0;i<n-1;i++)
{
x=mutemp;
y=array[i+1];
mutemp=multiple(x,y);
}
return (mutemp);
}
int main()
{
int n,i,A,B,t1,t2; /*定义整型变量*/
int array[MAX];
printf("please enter the number of integers to be calculated:\n"); /*提示输入要进行计算的整数个数*/
scanf("%d",&n); /*通过终端输入整数*/
if(n>MAX)
{
printf("Out of calculation range!\n");
}
else
{
printf("Please input %d integer numbers:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&array[i]);
}
t1=getDivisor(array,n); /*自定义主调函数*/
t2=getMultiple(array,n); /*自定义主调函数*/
printf("The higest common divisor of these numbers is : %d\n",t1); /*输出最大公约数*/
printf("The lowest common multiple of these number is : %d\n", t2); /*输出最小公倍数*/
return(0);
}
}
最终实现:
启示:请注意算法中变量数值之间的相互交换方法、如何取模、怎样进行自定义函数及主调函数与被调函数间的相互关系,函数参数的定义及对应关系特点,利用控制语句如何实现。