用C语言实现“约分最简分式”,基础编程由此开始(第二十一节)

我们都知道,分数一般是可以用“分子/分母”的形式来表示的,当然也可以用小数的形式来表示。

今天这道题目呢,是收录在基础编程题目集当中的第二十四题,它的要求是用户输入一个分数,然后将它约分为最简分式。最简分式指的就是分子和分母不具有可以约分的成分了。

比方说6/12可以约分为1/2,而当分子大于分母时,不需要表达为整数又分数的形式,分子和分母相同时,仍然用1/1的形式来表达。

梳理逻辑

1、要输入一个分数,分子和分母之间还有斜杠/分隔,在C语言当中呢,一般是用scanf函数来处理这个斜杠/的,这与我们之前讲的差不多。

2、而至于如何约分呢,这就是这道题目最为关键的地方了,我们都知道给定两个数后,比方说给了题目中的例子66和120,它们的最大公约数是多少,应该是6才对,而6是如何得到的呢,我们都听说过欧几里得算法,也知道这个算法是用来求最大公约数的。

不过呢,要是不知道欧几里得算法也没事,完全可以用穷举法做出这道题目。

因为要求最大公约数,如果我们从1开始数起的话,那只能得到最小公约数也就是1,但如果从120开始数起的话,只要满足小于120中的某个数(且是最大数),能够同时被66和120整除,那很显然,只有6才能满足这个条件,所以就能得到最大公约数为6。

这是分子小于分母的情况,那如果是分母小于分子的情况呢,也是同理的。

代码实现

//约分最简公式
#include <stdio.h>
int main() {
    int a;
    int b;
    scanf("%d/%d",&a,&b);
    if(a>b){
        for(int i = a;i>0;i--){
            if(a%i==0&&b%i==0){
                printf("%d/%d",a/i,b/i);
                break;
            }
        }
    }
    if(a<=b){
        for(int i=b;i>0;i--){
            if(a%i==0&&b%i==0){
                printf("%d/%d",a/i,b/i);
                break;
            }
        }
    }
}

结果测试

总结

总的来说,这道题目相较于之前的题目而言,难度有所下降,不过这里我用到的求最大公约数的方法是用一个穷举法,后面我会找时间来与大家探讨一下欧几里得算法的使用。

相关文章

你真的了解scanf吗(scanf-s)

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。其调用格式为: scanf("<格式化字符串&g...

结合缓冲区谈谈C语言scanf()函数的那些奇奇怪怪行为

scanf() 是从标准输入设备(键盘)读取数据,带有行缓冲区的,这让 scanf() 具有了一些独特的特点,例如可以连续输入、可以输入多余的数据等。反过来,scanf() 也出现了一些奇怪的行为,例...

C语言学习笔记系列—第三章(c语言第二章)

继续第二章之后的学习,上一章学习认识了一些最简单的C程序。第三章将基于C的数据类型进行笔记学习,和之前一样本文还是已一个重新学习角度去认识C语言,所以文中只会引用到需要数据类型介绍。不会像其他C语言教...

第3天:7天学会C语言,每天5分钟,不需要基础

昨天讲了系统安装,今天可以继续讲编写程序了。先把昨天的作业给做了,昨天的作业是编写C语言程序输出以下图形:程序如下:怎么样?很简单吧?复习一下,每一行第2个双引号前面的 \n 是什么?对了,是换行。上...

7.C语言-选择结构设计(c语言选择结构设计实验报告)

1.IF单分支结构if(表达式) 语句表达式可以是任意表达式,语句可以是一条语句,也可以是复合语句,执行过程,先判断表达式是否为真,如果为真,那么执行语句,如果为假,那么跳过语句执行后面的程序。flo...

C语言程序编写输入任意三个数求它们的平均值?

题目:输入任意三个数求它们的平均值?程序:#include<stdio.h> int main() { int a,b,c,sum; float avg; scanf("%d %...