求最大公因数
方法1:
int main()
{
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
while (a && b) //进行循环 &&逻辑与 a,b都不为0
{
if (a > b)
a %= b;//如果a>b则将a对b取余并将结果赋予a
else
b %= a;//b=b%a
}
printf("两数的最大公约数为:%d", a>b?a:b); //输出最大公约数,即输出a和b中较大的那个数。
}
逐行分析:
这段代码是一个简单的求两个整数的最大公约数的程序。下面对每行代码进行分析:
int main():这是程序的主函数,是程序执行的入口点。
int a, b;:定义了两个整型变量a和b,用于存储输入的两个整数。
printf("请输入两个整数:");:输出提示信息,要求用户输入两个整数。
scanf("%d %d", &a, &b);:从用户输入中读取两个整数,并将其分别存储到变量a和b中。
while (a && b):进入一个循环,条件是a和b都不为0,即两个整数都不为0时继续执行循环体。
if (a > b):判断a是否大于b。
a %= b;:如果a大于b,则将a对b取余,并将结果赋值给a。
else:如果a不大于b,则执行else后面的语句。
b %= a;:如果a不大于b,则将b对a取余,并将结果赋值给b。
printf("%d", a>b?a:b);:输出最大公约数,即输出a和b中较大的那个数。
表达式"a > b ? a : b"是条件运算符(也称为三元运算符)的使用。其意思是,如果条件"a > b"为真,则返回a的值,否则返回b的值。
数学知识分析:
最大公约数(Greatest Common Divisor,简称GCD):两个或多个整数中能够整除它们的最大正整数。
欧几里得算法:一种用于计算两个整数的最大公约数的算法。该算法的基本思想是通过反复将较大的数除以较小的数的余数,直到余数为0。最后一次非零余数即为最大公约数。
543=21*25+18
21=18+3
18=3*6+0
所以(543,21)=3
循环条件 while (a && b):当a和b都不为0时,执行循环体。这是因为最大公约数不等于0,只有当a或b为0时才可以结束循环。
if (a > b) a %= b 和 else b %= a:这两行代码根据a和b的大小关系来进行取余操作,目的是将较大的数不断除以较小的数,以求得最大公约数。如果a大于b,则将a对b取余,并将结果赋给a;否则,将b对a取余,并将结果赋给b。
printf("两数的最大公约数为:%d", a>b?a:b):根据欧几里得算法的性质,在循环结束后,a或b中非0的值即为最大公约数。这行代码使用条件运算符输出a和b中较大的数作为最大公约数。
方法2:
#include <stdio.h>
int main()
{
int a,b,c=0;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
while (b != 0)//注意赋值操作符=与判断操作符==
{
c = a%b;
a = b;
b = c;
}
printf("%d\n", a);
return 0;
}
逐行分析:
#include <stdio.h>:包含标准输入输出库的头文件。
int main():定义主函数,程序从这里开始执行。
int a,b,c=0;:定义三个整型变量a,b,c,并将c初始化为0。
printf("请输入两个整数:");:打印提示信息,要求用户输入两个整数。
scanf("%d%d", &a, &b);:通过scanf函数,读取用户输入的两个整数,分别赋值给变量a和b。
while (b != 0):使用while循环,判断条件是变量b不等于0。
{:循环体开始。
c = a%b;:计算变量a除以b的余数,并将余数赋值给变量c。
a = b;:将变量b的值赋值给变量a,实现赋值操作。
b = c;:将变量c的值赋值给变量b,实现赋值操作。
}:循环体结束。
printf("%d\n", a);:打印变量a的值,即最大公约数。
return 0;:返回0,表示程序正常结束。
这段代码的逻辑是不断用较小的数去除较大的数,直到其中一个数为0,此时另一个数就是最大公约数。这就是辗转相除法求最大公约数的基本思想。
在循环的每一轮中,将变量b的值赋给a,变量c的值赋给b。这样,a和b的值会逐步变化,直到b为0时跳出循环。此时,变量a的值就是两个输入整数的最大公约数。
此程序的功能是计算两个整数的最大公约数,使用的是辗转相除法。