905853663 发表于 2020-12-26 00:14:59

求最大公约数

#include<stdio.h>
main()
{
        int a,b,temp;
        void max(int a,int b);
        printf("请输入两个正整数:\n");
        scanf("%d,%d",&a,&b);
        if (a==b)
        printf("最大公约数为%d",a);
        else if (a<b)
        {temp=a;a=b;b=temp;
        max(a,b);}
}
void max(int a,int b)
{
    int i;
        int x,y;
    for (i=b;i>0;i--)
    {
        x=a%i;
    y=b%i;
    if (x==0||y==0)
    {printf("%d",i);
    break;}
    }
       }

代码如上,请问哪里有问题?编译正常,但结果不对

jackz007 发表于 2020-12-26 00:34:19

      不知道楼主用的是什么算法,给楼主一个标准的欧几里德(辗转相除)算法
#include <stdio.h>

int max(int a , int b)
{
      int i             ;
      while(b) {
                i = a % b ;
                a = b   ;
                b = i   ;
      }
      returna         ;
}

int main(void)
{
      int a , b                                  ;
      printf("请输入两个正整数:")               ;
      scanf("%d%d" , & a , & b)                  ;
      printf("最大公约数为 : %d\n" , max(a , b)) ;
}
      编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
请输入两个正整数:36 48
最大公约数为 : 12

D:\00.Excise\C>

风过无痕1989 发表于 2020-12-26 01:53:13

本帖最后由 风过无痕1989 于 2020-12-27 00:55 编辑

// 求最大公约数 greatest common divisor
#include<stdio.h>
main()
{
        int gcd(int *a, int *b);         // 函数名就取三个英文单词的第一个字母好了(当然可以用其他的函数名)
      int a, b, temp;                  // 声明函数放前面,此条语句移下来(不是因为其他,只是习惯上这么做)
        printf("请输入两个正整数:\n");
        scanf("%d%d", &a, &b);         // 除控制符外,不要添加其他的符号
        if (a == b)
                printf("最大公约数为%d", a);
        else if (a < b)                  // 此处已经是交换了,最大值就是 a
        {
                temp = a;
                a = b;
                b = temp;

                temp = gcd(&a, &b);      // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
                printf("greatest common divisor is %d\n", temp);
       }
}
int gcd(int *a, int *b)                  // 碾转相除法
{
        int x = 1;                     // x 不等于0就行,确保循环能进行即可
        while (x != 0)
        {
                x = *a % *b;             // 相数相除,取余数
                *a = *b;               // 除数作被除数
                *b = x;                  // 余数作除数,循环,直到 x = 0
        }
        return *a;
}

严凯 发表于 2020-12-26 14:59:28

你这个最下面弄错了把,应该是if(x==0&&y==0),你去看看||和&&的差别就知道了。

严凯 发表于 2020-12-26 15:40:25

还有哪个a和b的顺序别输入错了

905853663 发表于 2020-12-27 00:11:30

风过无痕1989 发表于 2020-12-26 01:53


就是形式参数是指针形式?

905853663 发表于 2020-12-27 00:12:08

严凯 发表于 2020-12-26 14:59
你这个最下面弄错了把,应该是if(x==0&&y==0),你去看看||和&&的差别就知道了。

我改了,也不行

风过无痕1989 发表于 2020-12-27 00:21:12

905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?

运行时也是指针形式呀,你稍等,我试试看,不用指针行不行,反正交换两个数值,不用指针是交换不了的

风过无痕1989 发表于 2020-12-27 00:26:44

本帖最后由 风过无痕1989 于 2020-12-27 00:58 编辑

905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险
// 求最大公约数 greatest common divisor
#include<stdio.h>
main()
{
        int gcd(int *a, int *b);         // 函数名就取三个英文单词的第一个字母好了(当然可以用其他的函数名)
      int a, b, temp;                  // 声明函数放前面,此条语句移下来(不是因为其他,只是习惯上这么做)
        printf("请输入两个正整数:\n");
        scanf("%d%d", &a, &b);         // 除控制符外,不要添加其他的符号
        if (a == b)
                printf("最大公约数为%d", a);
        else if (a < b)                  // 此处已经是交换了,最大值就是 a
        {
                temp = a;
                a = b;
                b = temp;

                temp = gcd(a, b);      // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
                printf("greatest common divisor is %d\n", temp);
       }
}
int gcd(int a, int b)                  // 碾转相除法
{
        int x = 1;                     // x 不等于0就行,确保循环能进行即可
        while (x != 0)
        {
                x = a % b;             // 相数相除,取余数
                a = b;               // 除数作被除数
                b = x;                  // 余数作除数,循环,直到 x = 0
        }
        return a;
}

905853663 发表于 2020-12-27 12:14:20

风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险

噢噢好的

905853663 发表于 2020-12-29 10:49:49

风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险

我还是想知道我那个代码是哪里错了,我一直分析都感觉没错误,但是我输入两个连续的数比如34和35,它就能显示结果1,但是其他数据输出的东西是空白,我又改了一下
#include<stdio.h>
main()
{
        int a,b,temp;
        void max(int a,int b);
        printf("请输入两个正整数:\n");
        scanf("%d%d",&a,&b);
        if (a==b)
        printf("最大公约数为%d",a);
        else if (a<b)
        {temp=a;a=b;b=temp;
        max(a,b);}
}
void max(int a,int b)
{
    int i;
        int x,y;
    for (i=b;i>0;i--)
    {
        x=a%i;
    y=b%i;
    if (x==0&&y==0)
    {printf("%d",i);
    break;}
    }
}

905853663 发表于 2020-12-29 10:58:01

风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险

已经知道了,是一个花括号搞错了{:10_266:}
页: [1]
查看完整版本: 求最大公约数