C语言求最大公约数和最小公倍数,麻烦找错谢谢!

来源:百度知道 编辑:UC知道 时间:2024/06/12 04:51:15
function1是用更相减损求最大公约数,function2是利用最大公约数求最小公倍数,无语法错误

本来都写在main里的,没有问题能正常运行,分成两个函数以后就不行了
以下是源代码

#include <stdio.h>

int max,min;
int function1(int m,int n)
{
int a,b;
if(m==n)
return m;

while(m>n)
{
a=m,b=n;
if(m-n>=n)
a=m-n,b=m;
else
a=n;b=m-n;
m=a,n=b;
if(m==n)
return m;

}

while(m<n)
{
a=n,b=m;
if(n-m>=m)
a=n-m,b=m;
else
a=m,b=n-m;
n=a,m=b;
if(m==n)
return m;

}
}

extern int m;
int function2()
{
return ((max/m)*(min/m)*m);
}

int m,n;
void main()
{
int x,y;

printf("请输入两个正整数:");
scanf("%d%d",&m,&n);
max=m>n?m:n;
min=m<n?m:n;

x=function1(m,n);
y=function2();
printf("两个数的最大公约数

int function2(int i)
{
return max*min/i;
}
********************
y=function2(x);
*******************
给你把最小公倍数的,函数加了个参加,就是最大公约数,
然后调用的地方把实参放进去。
你写的全局变量有点多,而且,名字和局部的还相同,有的时候
全局被屏蔽了,得的不一定是你想要的结果。

我给你个示范:

#include <stdio.h>
#include <stdarg.h>

// 求2个数的最大公约数,辗转相除法
int GCD(int lhs, int rhs)
{
return rhs % lhs ? GCD(rhs % lhs, lhs) : lhs;
}

// n个数的最大公约数
int NGCD(int n, ...)
{
va_list argPtr;
va_start(argPtr, n);
int gcd = va_arg(argPtr, int);

for(int i = 1; i < n; ++i)
gcd = GCD(gcd, va_arg(argPtr, int));
va_end(argPtr);
return gcd;
}

// n个数的积
int NProduct(int n, ...)
{
int pdt = 1;

va_list argPtr;
va_start(argPtr, n);
for(int i = 0; i < n; ++i)
pdt *= va_arg(argPtr, int);
va_end(argPtr);
return pdt;
}