每天几道题——C语言(1)

 求最大公因数

方法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):根据欧几里得算法的性质,在循环结束后,ab中非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的值就是两个输入整数的最大公约数。

此程序的功能是计算两个整数的最大公约数,使用的是辗转相除法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值