说明
编程软件:Visual Studio 2019
程序语言:C语言
参考资料链接:
- https://baike.baidu.com/item/%E7%BA%A6%E6%95%B0/8417882(里面有负约数概念)
- https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%BA%A6%E6%95%B0/869308?fr=aladdin(最大公约数)
- https://zhidao.baidu.com/question/1740022279691583187.html(负数有公约数或公倍数么)
- http://blog.sina.cn/dpool/blog/s/blog_5621ce20010008jr.html
(负数有没有公约数,公约数能不能为负数)里面无实际内容 - https://blog.csdn.net/PhoenixZi/article/details/105045934 (今日代码:给定两个数,求这两个数的最大公约数)
- https://blog.csdn.net/youngdze/article/details/13628877 (c语言编程中如何判断一个数是否为整数)
- https://zhidao.baidu.com/question/1382271736490608220.html (c语言如何判断输入类型?)
- 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提出的问题进行改进,增加了的内容是:当输入为字符时,提示重新输入。直到输入为正整数时,才会输出正确的结果。该程序存在的不足是:无法显示具体的错误是什么。如果程序能改成无论输入什么类型的数据都能提示对应的错误,那就完美了。