请问该如何实现计算a,b的所有公约数?具体看下面!

实现函数int CommonFactors(int a,int b),计算a,b的所有公约数。第一次调用,返回最大公约数,以后只要使用相同参数调用,每次返回下一个小一些的公约数。无公约数返回-1。以下是我的源代码:

/*
函数功能:计算两个正整数的最大公约数
函数入口参数:两个正整数
函数返回值:两个正整数的最大公约数
*/
int MaxCommonFactor(int x, int y)
{
while(x != y)
{
if(x > y)
{ x = x - y; }
else
{ y = y - x; }
}
return x;
}
/*
函数功能:计算两个整数的所有公约数
函数入口参数:两个整数
函数返回值:第一次返回最大公约数,以后返回下一个小一些的公约数;无公约数是返回-1
*/
int CommonFactor(int h, int k)
{
int b;
int i; //定义循环变量

b = MaxCommonFactor(h, k); //存放最大公约数的变量
for(i=b; i>0; i--)
{
if(h%i == k%i)
{
return i;
}
}
return -1;
}
/*主函数*/

void main()
{
int a;
a = CommonFactor(100, 50);
printf("CommonFactor = %d\n",a); //按题目意思,这里应该打印50

a = CommonFactor(100, 50);
printf("CommonFactor = %d\n",a); //按题目意思,这里应该打印25
}

具体的理解是这样的:在一次执行内,这个函数被调用了多次,但是每次打印的结果不同。比如,求100和50的公约数,题目的要求是:第一次调用打印出50,第二次调用打印出25,第三次调用打印出10,第四次调用打印出2,第五次调用打印出1;但是你可以只是调用两次,打印出50和25,而不是一次调用就把全部公约数全部的打印完。

我的疑问是:我不能实现第二次打印25,第二次和以后的调用都是输出50,请高手帮忙修改一下程序,最好也有详细的解释。谢谢!!这题目搞了我一个下午,我初学,奔泪。。。
主要是int CommonFactor(int h, int k)的实现,int MaxCommonFactor(int x, int y)是没有问题的吧。另外,希望不要用到数组,指针,结构体。

翻过高山走不出你
浏览 568回答 2
2回答

ibeautiful

//按题目的意思要判断是否使用相同的参数struct{int a, b, gcd, k;}A[256];int N = 0;int gcd(int a, int b){int t = a%b;while(t){a = b;b = t;t = a%b;}return b;}int CommonFactor(int a, int b){int i, k, y;for(i=0; i<N; i++)if(a==A[i].a && b==A[i].b)break;if(i==N){A[N].a = a;A[N].b = b;A[N].k = 1;A[N].gcd = gcd(a, b);++N;return A[i].gcd;}k = 0;for(y = A[i].gcd-1; y>0; y--){if(A[i].gcd % y == 0)++k;if(k==A[i].k)break;}if(k!=A[i].k)return -1;++A[i].k;return y;}void fun(int a, int b){printf("(%d %d) : %d\n", a, b, CommonFactor(a, b));}int main(){fun(100, 50);fun(4, 6);fun(100, 50);fun(4, 6);fun(100, 50);fun(100, 50);fun(100, 50);fun(100, 50);fun(100, 50);}
打开App,查看更多内容
随时随地看视频慕课网APP