zmLau0727 发表于 2019-11-8 21:10:13

为什么我写的这个求最大公约的是程序不能稳定运行

求最大公约数,要求输入两个数,但有的可以正常运行,有的不行。不如24 56,这组求出来的最大公约数是1

zmLau0727 发表于 2019-11-8 21:10:46

#include<stdio.h>
int main()
{
        int a,b,n,max;
        scanf("%d %d",&a,&b);
        if(a*b==0&&a!=b)//如果a,b其中一个为0,则最大公因数为较大的一个
        {
                if(a>b)
                {
                        max=a;
                }
                else
                {
                        max=b;
                }
        }
        else if(a*b!=0&&a>b)//如果a,b均不为0 ,这里是a>b,下面一个else是a<b
        {
                for(n=1;n<=b;n++)//寻找公因数
                {
                        if(a%n==0&&b%n==0)
                        max=n;//把较大的一个公因数赋值给max
                       
                }
        }
        else if(a*b!=0&&b>a)
        {
                for(n=a;n<=a;n++)
                {
                        if(a%n==0&&b%n==0)
                        max=n;
               
                }
        }
        else//这里是ab相等
        {
                max=a;
        }
        printf("%d\n",max);
        return 0;
}

jackz007 发表于 2019-11-8 21:21:04

本帖最后由 jackz007 于 2019-11-8 21:51 编辑

      试试我写的用辗转相除法计算最大公约数的代码,如果返回值是 1,那就说明两个数没有最大公约数。
int gcd(int x , int y)
{
      int t , ret = 0         ;
      if(x > 0 && y > 0) {
                while(y > 0) {
                        t = x % y ;
                        x = y   ;
                        y = t   ;
                }
                ret = x         ;
      }
      return ret                ;
}

zmLau0727 发表于 2019-11-8 21:28:11

jackz007 发表于 2019-11-8 21:21
试试我写的用辗转相除法计算最大公约数的代码,如果返回值是 1,那就说明两个数没有最大公约数。

呃呃,你这个我编译的时候报错

jackz007 发表于 2019-11-8 21:35:45

zmLau0727 发表于 2019-11-8 21:28
呃呃,你这个我编译的时候报错

      把报错信息贴出来看看

zmLau0727 发表于 2019-11-8 21:45:48

jackz007 发表于 2019-11-8 21:35
把报错信息贴出来看看

这样的

jackz007 发表于 2019-11-8 21:47:41

本帖最后由 jackz007 于 2019-11-8 21:50 编辑

      我只是给你写了计算最大公约数的 gcd() 函数,需要复制到你的程序里,由你来调用。

      下面是我写的完整代码,现在再编译试试看。

#include <stdio.h>

int gcd(int x , int y)
{
      int t , ret = 0         ;
      if(x > 0 && y > 0) {
                while(y > 0) {
                        t = x % y ;
                        x = y   ;
                        y = t   ;
                }
                ret = x         ;
      }
      return ret                ;
}

int main(void)
{
      int k , m , n                                              ;
      printf("\t请输入 m n : ")                                  ;
      scanf("%d%d" , & m , & n)                                  ;
      if((k = gcd(m , n)) > 1) printf("\t最大公约数是:%d\n" , k) ;
      else printf("\t没有最大公约数\n")                        ;
      return 0                                                   ;
}试试这个,完整代码:

zmLau0727 发表于 2019-11-8 21:52:33

jackz007 发表于 2019-11-8 21:47
我只是给你写了计算最大公约数的 gcd() 函数,需要复制到你的程序里,由你来调用。

      下面是 ...

这个可以运行,可是我写的那个哪里有错啊

zmLau0727 发表于 2019-11-8 21:53:12

zmLau0727 发表于 2019-11-8 21:52
这个可以运行,可是我写的那个哪里有错啊

噢噢,我还没学到函数,

zmLau0727 发表于 2019-11-8 21:54:15

jackz007 发表于 2019-11-8 21:47
我只是给你写了计算最大公约数的 gcd() 函数,需要复制到你的程序里,由你来调用。

      下面是 ...

噢噢,我还没学到函数

jackz007 发表于 2019-11-8 22:08:01

zmLau0727 发表于 2019-11-8 21:54
噢噢,我还没学到函数

   你用的是什么算法,完全搞不懂,没法帮你找问题,倒是按辗转相除法帮你修改了代码,你再试试看吧:
#include<stdio.h>
int main()
{
      int a , b , n , max = 0   ;
      scanf("%d%d", & a , & b);
      if(a > 0 && b > 0) {
                while(b) {
                        n = a % b ;
                        a = b   ;
                        b = n   ;
                }
                max = a         ;
      }
      printf("%d\n" , max)      ;
      return 0                  ;
}

倒戈卸甲 发表于 2019-11-8 22:21:13

手边没电脑,读了遍程序,看到一处笔误,b>a情形下的for循环是从n=a开始的,其他没看出来

一个账号 发表于 2019-11-8 22:35:19

程序呢?

zmLau0727 发表于 2019-11-8 22:51:09

倒戈卸甲 发表于 2019-11-8 22:21
手边没电脑,读了遍程序,看到一处笔误,b>a情形下的for循环是从n=a开始的,其他没看出来

噢噢,确实有个笔误的问题,之前我想要break,没写条件,现在问题已经解决了
页: [1]
查看完整版本: 为什么我写的这个求最大公约的是程序不能稳定运行