首先,这是Euclid计算GCD
的算法(知道它的人可以直接跳到代码中)。
GCD(m,n)=GCD(n,m mod n)
并继续执行此功能,直到您得到以下内容:GCD(m,n)=GCD(answer,0)
。当你得到这个,你停下来,这就是我的程序试图做的事情。但是我想找到另一件事。递归GCD调用/分区的数量(让我们将此变量称为COUNT用于会话目的)它在答案中实际到达所需的数量。例如
GCD(60,24) = GCD (24, 12) = GCD (12, 0) =12
所以这里的COUNT是3(包括最后一个),因为我们使用了Euclid算法两次。
在下面的代码中,我试图打印COUNT以及数字组合的GCD值,我似乎得到了错误的答案。
P.P.S我希望我已经正确解释了这一点。
这是代码
#include<stdio.h>
int gcd(int m , int n);
int count=0;
int main()
{
int m,n;
for(m=1;m<=10;m++)
{
for(n=1;n<=m;n++)
{
printf("gcd of %d, %d is :%d",m,n,gcd(m,n));
printf(" with %d iterations\n",count);
}
}
}
int gcd(int m , int n)
{
if(n==0)
{
return m;
count=0;
}
if(m<n)
{
//swapping both a and b
m=m+n;
n=m-n;
m=m-n;
}
else
{
count++;
return gcd(n, m%n);
}
}
答案 0 :(得分:1)
首先,您的count = 0
位于return
声明之后。因此,它永远不会执行!
但是,即使在您切换count = 0
和return
后,它仍然不正确,因为您在增加count
后基本上将0
设置为count
。例如:
gcd(60,24) => count++ => count = 1
gcd(24, 12) => count++ => count = 2
gcd(12, 0) => count = 0 => count = 0
正确的方法是执行以下操作:
count = 0
gcd(60,24) => count++ => count = 1
gcd(24, 12) => count++ => count = 2
gcd(12, 0) => count++ => count = 3
此外,您的代码流程不正确。如果您致电gcd(5, 15)
会怎样?您交换5
和15
,但之后您根本没有退货!修复它的方法是删除else
语句。
这是重构的代码:
#include<stdio.h>
int gcd(int m , int n);
int gcd_wrapper(int m, int n);
int count=0;
int main(){
int m,n;
for(m=1;m<=10;m++)
{
for(n=1;n<=m;n++)
{
printf("gcd of %d, %d is :%d",m,n,gcd_wrapper(m,n));
printf(" with %d iterations\n",count);
}
}
return 0;
}
int gcd_wrapper(int m, int n) {
count = 0;
return gcd(m, n);
}
int gcd(int m , int n){
count++;
if(n == 0){
return m;
}
if(m < n){
//swapping both a and b
m=m+n;
n=m-n;
m=m-n;
}
return gcd(n, m%n);
}