关于C语言最大公约数的相关数学问题

关于C语言最大公约数的相关数学问题,想请教一下这个代码是为什么就可以求出来最大公约数,原理是什么?求解释一下

img

最大公约数,一定是 能被 x 或 y 同时整除的 最大的数

  • 首先while 判断条件是 x % y != 0, 如果 x % y == 0 , 那 y 就是 最大公约数,这个好理解吧
  • while 循环内 取 x % y 的值,这个值t 后面继续 赋值给 y , 原始的y 赋值给 x; 继续下一轮判断,直到 x % y == 0,那 y 不就是在找最大的那个公约数嘛

百度辗转相除法

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/890473
  • 你也可以参考下这篇文章:C语言 求最大公约数的三种方法,利用最大公约数求最小公倍数,通过分解质因数法来验证
  • 除此之外, 这篇博客: C语言最大公约数和判断素数中的 判断一个数是否为素数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    int main() {
    	// 初始化变量
    	int n = 0;
    	int i = 0;
    	int flag = 1;
    	// 输入数字
    	scanf("%d", &n);
    	//设置循环程序
    	for (i = 2; i < n; i++) {
    		if (n % i == 0) {
    			flag = 0;
    		}
    	}
    	if (flag == 1) {
    		printf("这是素数,是%d\n", n);
    	}
    	else {
    		printf("这不是素数\n");
    	}
    	return 0;
    }
    
  • 您还可以看一下 李老师老师的C语言版数据结构入门课程中的 数据结构入门简介小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,这段代码使用的是穷举法来求解两个数的最大公约数,从小到大枚举每个自然数是否同时为两个数的约数,并找到最大的一个即为所求的最大公约数。但是这种方法非常慢,有时需要遍历所有的数才行,所以可以采用更为高效的辗转相除法。

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

    下面是采用辗转相除法计算最大公约数的C代码:

    int gcd(int a, int b){
        if(a < b){
            int temp1 = a;
            a = b;
            b = temp1;
        }
        while(b != 0){
            int temp2 = b;
            b = a % b;
            a = temp2;
        }
        return a;
    }
    

    上述代码中用到了函数,函数的定义如下:

    int gcd(int a, int b)
    

    其中,int表示返回值类型为整型,gcd表示函数名,(int a, int b)表示两个输入参数类型为整型。函数返回的是两个数的最大公约数。

    使用该函数的代码如下:

    #include <stdio.h>
    //函数声明
    int gcd(int a, int b); 
    int main()
    {
        printf("The greatest common divisor is %d\n", gcd(100, 60));
        return 0;
    }
    

    其中,第一行为函数声明,函数的定义在之后,调用该函数在printf语句中,输出结果为最大公约数。