微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我尝试编写一个使用函数查找 GCD 的程序为什么这段代码不起作用?

如何解决我尝试编写一个使用函数查找 GCD 的程序为什么这段代码不起作用?

这是我到目前为止编写的代码,我找不到任何逻辑冗余。请帮忙。

#include<stdio.h>   

int gcd(int,int);  
void main()

{
int a,b,c;
printf("enter 2 num\n" );
scanf("%d%d",&a,&b);  
printf("gcd of %d and %d is %d",a,gcd(a,b));
}

int gcd(int a,int b)  
{
int i,c;
for(i=0;i<a&&i<b;i++)
{
    if((a%i==0)&&(b%i==0))
        
    c=i;
    
}
return c;

}

我没有得到任何输出。 输入:25,75

ps。我的第一个问题

编辑:感谢您的帮助,我犯了一个愚蠢的错误并初始化了 i=0,所以我的程序崩溃了。

解决方法

除非我的假设是错误的,否则您使用的函数是错误的。 你能指定你对函数使用哪种算法吗? 如果你愿意,你可以参考下面附上的基于欧几里得 GCD 算法的函数。

int euclid(int x,int y)
{
    if (y == 0) {
     return x;
    } else if (x >= y && y > 0) {
       return euclid(y,(x % y));
  } 
}  

完整的程序:

#include <stdio.h>
#include <time.h>
int euclid(int,int);
int main()
{
  int m,n,gcd;
  clock_t start,end;
  double cpu_time_used; 
  printf("\nEnter two numbers to find gcd using Euclidean algorithm: ");
  scanf("%d%d",&m,&n);
  start=clock(); 
  gcd = euclid(m,n);
  end=clock();
  cpu_time_used=((double) (end-start)) / CLOCKS_PER_SEC;
  if (gcd){
    printf("\nThe GCD of %d and %d is %d",m,gcd);
    printf("\nGCD Function took %lf Seconds to Execute\n\n",cpu_time_used);
  }
  else
    printf("\nInvalid input\n");
  return 0;
 }


int euclid(int x,int y)
{
  if (y == 0) {
      return x;
  } else if (x >= y && y > 0) {
      return euclid(y,(x % y));
  }
 }
,

当我运行您的代码时,它崩溃了,因为您在 for 循环的第一轮进行了除以 0。您将 i 初始化为 0,然后将其与 ab 一起使用以执行 % 操作。因此,如果 a 为 10,则类似于“将 10 除以 0 并得到余数”。您不能将数字除以 0,因为它是未定义的。

对方的功能也不错。这是我曾经写过的一个版本,它是迭代的而不是递归的。底部 while 循环之前开头的内容只是设置为处理负数并确保 n1 始终大于 n2。实际的算法是 while 循环。


int gcd(int numerator,int denominator) {
    int remainder,temp,n1,n2;
    if (numerator < 0) numerator *= -1;
    if (denominator < 0) denominator *= -1;
    if (numerator > denominator) {
        n1 = numerator;
        n2 = denominator;
    }
    else {
        n1 = denominator;
        n2 = numerator;
    }

    remainder = n1 % n2;
    while (remainder > 0) {
        n1 = n2;
        n2 = remainder;
        remainder = n1 % n2;
    }

    return n2;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。