找出2个正整数的最大公约数

 方法一:循环遍历(最容易想到的,比较繁琐!)

#define  _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
int main() {
    int a, b;
    int min,max;
    printf("请输入两个正整数:\n");
    scanf("%d %d", &a, &b);
    min = a < b ? a : b;
    for (int i = 2;i <= min;i++) {
        if (a%i == 0 && b%i == 0) {
            max = i;
        }
    }
    printf("最大公约数是:%d", max);
    return 0;
}


上述代码问题: 如果两个数互质如(4和5) 则会出现如下错误

意思为变量max没有被初始化,因此在前面定义max时给max赋一个初值0.

此时需要加一个if语句说明这两个数互质  更改后的代码为:

#define  _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
int main() {
    int a, b;
    int min;
    int max = 0;
    printf("请输入两个正整数:\n");
    scanf("%d %d", &a, &b);
    min = a < b ? a : b;
    for (int i = 2;i <= min;i++) {
        if (a%i == 0 && b%i == 0) {
            max = i;
        }
    }
    if (max == 0) {
        printf("这两个数互质!\n");
    }
    else {
        printf("最大公约数是:%d\n", max);
    }
    return 0;
}

方法二:辗转相除法
又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
int main() {
    int a, b;
    int min,max,temp;
    printf("请输入两个数字:\n");
    scanf("%d %d", &a, &b);
    min = a > b ? b : a;
    max = a > b ? a : b;
    while (max%min != 0) {
        temp = max%min;
        max = min;
        min = temp;
    }
    if (min == 1) {
        printf("这两个数互质.");
    }
    else {
        printf("这两个数字的最大公约数为:%d\n", min);
    }
    return 0;
}



方法三:辗转相减法
辗转相减法是一种简便的求出两数最大公约数的方法。(更相减损术)

辗转相减法(求最大公约数),即尼考曼彻斯法,其特色是做一系列减法,从而求得最大公约数。例如 :两个自然数35和14,用大数减去小数,(35,14)->(21,14)->(7,14),此时,7小于14,要做一次交换,把14作为被减数,即(14,7)->(7,7),再做一次相减,结果为0,这样也就求出了最大公约数7

代码如下:

#define  _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
int main() {
    int a, b;
    int min, max;
    int temp;
    printf("请输入两个正整数:\n");
    scanf("%d %d", &a, &b);
    min = a > b ? b : a;
    max = a > b ? a : b;
    while (max - min != 0) {
        temp = max - min;
        max = temp > min ? temp : min;
        min = temp > min ? min : temp;
    }
    printf("最大公约数是:%d\n", max);
    return 0;
}


以上只是本人拙见 多有纰漏望指出 !
————————————————
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值