用C语言程序求两个正整数的最大公约数


说明

编程软件:Visual Studio 2019
程序语言:C语言
参考资料链接

  1. https://baike.baidu.com/item/%E7%BA%A6%E6%95%B0/8417882(里面有负约数概念)
  2. https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%BA%A6%E6%95%B0/869308?fr=aladdin(最大公约数)
  3. https://zhidao.baidu.com/question/1740022279691583187.html(负数有公约数或公倍数么)
  4. http://blog.sina.cn/dpool/blog/s/blog_5621ce20010008jr.html
    (负数有没有公约数,公约数能不能为负数)里面无实际内容
  5. https://blog.csdn.net/PhoenixZi/article/details/105045934 (今日代码:给定两个数,求这两个数的最大公约数)
  6. https://blog.csdn.net/youngdze/article/details/13628877 (c语言编程中如何判断一个数是否为整数)
  7. https://zhidao.baidu.com/question/1382271736490608220.html (c语言如何判断输入类型?)
  8. https://blog.csdn.net/qq_26768741/article/details/50933598 (C语言之清空缓存区)

提示:以下是本篇文章正文内容,下面案例可供参考

1 程序代码

代码如下(示例):

代码1:

//函数功能:给定两个正整数,求这两个整数的最大公约数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	float a = 0.f, b = 0.f, c = 0.f;
	printf("请输入两个正整数:>");
	while (a <= 0.f || b <= 0.f || (int)a != a || (int)b != b)
	{
		scanf("%f %f", &a, &b);
		if (a <= 0.f || b <= 0.f || (int)a != a || (int)b != b)
		{
			printf("注意:需要输入两个“正整数”!!!>\n");
			printf("等待再次输入:>");
		}
		else
		{
			c = (a > b) ? b : a;             //将较小的值赋给c
			while ((int)a % (int)c != 0.f || (int)b % (int)c != 0.f)    //求最大公约数   
			{
				c--;
			}
			printf("最大公约数是:%d\n", (int)c);
		}
	}
	return 0;
}

2 运行结果

在这里插入图片描述

可以发现当输入的数字有负数、0、或非整数时,程序会提示有错误,并要求重新输入。

总结1

本文仅仅简单给出了求两个正整数最大公约数的C程序,该程序可以判断输入是否为正整数,当输入为非正数、非整数时,会提示重新输入。直到输入为正整数时,才会输出正确的结果。该程序存在的不足是:如果不小心输入了char类型数据就会陷入死循环,这是以后需要改进的地方。如果程序能改成无论输入什么类型的数据都不会出现bug,那就完美了。最后附个精简代码,方便各位理解。

精简代码:

代码2:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//函数功能:求两个正整数的最大公约数
int main()
{
	int a = 0, b = 0, c = 0;
	printf("请输入两个正整数:>");
	scanf("%d %d", &a, &b);
	c = (a > b) ? b : a;             //将a、b中较小的值赋给c
	while ((a % c != 0) || (b % c != 0))    //求最大公约数   
	{
		c--;
	}
	printf("最大公约数是:%d\n", c);
	return 0;
}

2021年1月13日09:35:12更新

2021年1月13日改进

代码1给出的程序,如果不小心输入了char类型数据就会陷入死循环,针对这个问题进行改进,改进的思想是利用scanf的返回值和清空缓存区。

代码3:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	float a = 0.f, b = 0.f, c = 0.f;
	int flag = 0;
	printf("请输入两个正整数:>");
	while (a <= 0.f || b <= 0.f || (int)a != a || (int)b != b)
	{
		flag = scanf("%f %f", &a, &b);//scanf如果是从缓存中读取是两个数字,就会返回2
		if (flag != 2 || a <= 0.f || b <= 0.f || (int)a != a || (int)b != b)
		{
			printf("注意:需要输入两个“正整数”!!!>\n");
			printf("等待再次输入:>");
			rewind(stdin);//清理标准输入流的缓存
		}
		else
		{
			c = (a > b) ? b : a;             //将较小的值赋给c
			while ((int)a % (int)c != 0.f || (int)b % (int)c != 0.f)    //求最大公约数   
			{
				c--;
			}
			printf("最大公约数是:%d\n", (int)c);
		}
	}
	return 0;
}

运行结果:
在这里插入图片描述

可以发现当输入的数字有字符、负数、0、或非整数时,程序会提示有错误,并要求重新输入。

总结2

本次针对代码1提出的问题进行改进,增加了的内容是:当输入为字符时,提示重新输入。直到输入为正整数时,才会输出正确的结果。该程序存在的不足是:无法显示具体的错误是什么。如果程序能改成无论输入什么类型的数据都能提示对应的错误,那就完美了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值