鱼C论坛

 找回密码
 立即注册
查看: 1307|回复: 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
就是形式参数是指针形式?

刚才试错了,不用指针也是可以的。不过通过了函数这个东西,我还是习惯于用指针,用指针保险
// 求最大公约数 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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     ;
        }
        return  a         ;
}

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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2020-12-26 15:40:25 | 显示全部楼层
还有哪个a和b的顺序别输入错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是形式参数是指针形式?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我改了,也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

运行时也是指针形式呀,你稍等,我试试看,不用指针行不行,反正交换两个数值,不用指针是交换不了的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

噢噢好的
想知道小甲鱼最近在做啥?请访问 -> 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;}
    }
}  

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

已经知道了,是一个花括号搞错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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