为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻过高山走不出你 2021-06-30 11:07:43
实现函数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); //按题目意思,这里应该打印50a = 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)是没有问题的吧。另外,希望不要用到数组,指针,结构体。
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

//按题目的意思要判断是否使用相同的参数
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);
}



查看完整回答
反对 回复 2021-07-04
  • 2 回答
  • 0 关注
  • 563 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信