鱼C论坛

 找回密码
 立即注册
查看: 1467|回复: 11

[已解决]求最大公约数

[复制链接]
发表于 2020-12-26 00:14:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;}
    }
       }

代码如上,请问哪里有问题?编译正常,但结果不对
最佳答案
2020-12-27 00:26:44
本帖最后由 风过无痕1989 于 2020-12-27 00:58 编辑
905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?

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

  16.                 temp = gcd(a, b);      // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
  17.                 printf("greatest common divisor is %d\n", temp);
  18.        }
  19. }
  20. int gcd(int a, int b)                  // 碾转相除法
  21. {
  22.         int x = 1;                       // x 不等于0就行,确保循环能进行即可
  23.         while (x != 0)
  24.         {
  25.                 x = a % b;             // 相数相除,取余数
  26.                 a = b;                 // 除数作被除数
  27.                 b = x;                  // 余数作除数,循环,直到 x = 0
  28.         }
  29.         return a;
  30. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-26 00:34:19 | 显示全部楼层
        不知道楼主用的是什么算法,给楼主一个标准的欧几里德(辗转相除)算法
  1. #include <stdio.h>

  2. int max(int a , int b)
  3. {
  4.         int i             ;
  5.         while(b) {
  6.                 i = a % b ;
  7.                 a = b     ;
  8.                 b = i     ;
  9.         }
  10.         return  a         ;
  11. }

  12. int main(void)
  13. {
  14.         int a , b                                  ;
  15.         printf("请输入两个正整数:")               ;
  16.         scanf("%d%d" , & a , & b)                  ;
  17.         printf("最大公约数为 : %d\n" , max(a , b)) ;
  18. }
复制代码

        编译、运行实况:
  1. D:\00.Excise\C>g++ -o x x.c

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

  5. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-26 01:53:13 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-12-27 00:55 编辑
  1. // 求最大公约数 greatest common divisor
  2. #include<stdio.h>
  3. main()
  4. {
  5.         int gcd(int *a, int *b);         // 函数名就取三个英文单词的第一个字母好了(当然可以用其他的函数名)
  6.         int a, b, temp;                    // 声明函数放前面,此条语句移下来(不是因为其他,只是习惯上这么做)
  7.         printf("请输入两个正整数:\n");
  8.         scanf("%d%d", &a, &b);           // 除控制符外,不要添加其他的符号
  9.         if (a == b)
  10.                 printf("最大公约数为%d", a);
  11.         else if (a < b)                  // 此处已经是交换了,最大值就是 a
  12.         {
  13.                 temp = a;
  14.                 a = b;
  15.                 b = temp;

  16.                 temp = gcd(&a, &b);      // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
  17.                 printf("greatest common divisor is %d\n", temp);
  18.        }
  19. }
  20. int gcd(int *a, int *b)                  // 碾转相除法
  21. {
  22.         int x = 1;                       // x 不等于0就行,确保循环能进行即可
  23.         while (x != 0)
  24.         {
  25.                 x = *a % *b;             // 相数相除,取余数
  26.                 *a = *b;                 // 除数作被除数
  27.                 *b = x;                  // 余数作除数,循环,直到 x = 0
  28.         }
  29.         return *a;
  30. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-26 14:59:28 | 显示全部楼层
你这个最下面弄错了把,应该是if(x==0&&y==0),你去看看||和&&的差别就知道了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-26 15:40:25 | 显示全部楼层
还有哪个a和b的顺序别输入错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-27 00:11:30 | 显示全部楼层

就是形式参数是指针形式?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我改了,也不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-27 00:21:12 | 显示全部楼层
905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?

运行时也是指针形式呀,你稍等,我试试看,不用指针行不行,反正交换两个数值,不用指针是交换不了的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-27 00:26:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-12-27 00:58 编辑
905853663 发表于 2020-12-27 00:11
就是形式参数是指针形式?

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

  16.                 temp = gcd(a, b);      // 使用函数要传地址,否则函数使用完了,数据也就自动消失了
  17.                 printf("greatest common divisor is %d\n", temp);
  18.        }
  19. }
  20. int gcd(int a, int b)                  // 碾转相除法
  21. {
  22.         int x = 1;                       // x 不等于0就行,确保循环能进行即可
  23.         while (x != 0)
  24.         {
  25.                 x = a % b;             // 相数相除,取余数
  26.                 a = b;                 // 除数作被除数
  27.                 b = x;                  // 余数作除数,循环,直到 x = 0
  28.         }
  29.         return a;
  30. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

噢噢好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;}
    }
}  

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-29 10:58:01 | 显示全部楼层
风过无痕1989 发表于 2020-12-27 00:26
刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险

已经知道了,是一个花括号搞错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-3 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表