遇到一道有意思的题目,在此分享一下
作者:互联网
约分最简分式
分数可以表示为分子/分母
的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/
分隔,如:12/34
表示34分之12。分子和分母都是正整数
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母
的形式表示分数。如 5/6
表示6分之5。
输入样例:
66/120
输出样例:
11/20
我的思路是,当分子分母任意一者为素数且无法相互整除时,约分就完成了。
以下 :
#include<stdio.h>
#include<math.h>
int main()
{
int son,mother;//分子和分母,很好理解对吧
scanf("%d/%d",&son,&mother);
int i,j,sign=0;//i:分子和分母的公约数,j:循环判定分子和分母是否为素数(我重复用了两次)
//sign: 用于离开“公约数(i)”循环
for(i=2;sign==0;i++)//公约数i取1没有意义,直接定义为2
{
int judge1=1,judge2=1;//judge1:判定分子是否为素数,judge2:判定分母是否为素数
while(son%i==0&&mother%i==0)//当i确实是公约数时,分子分母同时整除,直到无法整除为止
{
son/=i;
mother/=i;
}
for(j=2;j<=sqrt(son);j++)//这个素数判定比较经典了,不明白可以百度一下
if(son%j==0)
{
judge1=0;
break;
}
for(j=2;j<=sqrt(mother);j++)
if(mother%j==0)
{
judge2=0;
break;
}
if(judge1||judge2)//当分子分母二者任意一者为素数时,可以进行输出准备了。
//当分子分母任意一者为素数时,除非另一者可以正好整除
//这个素数,否则就已经无法再约分了
if(mother%son!=0&&son%mother!=0)//这里是直接输出的分支,也就是分子分母其中一者为
{ //素数,且另一者无法整除。因为不确定分子分母大小
printf("%d/%d",son,mother); //关系,所以要保证哪种情况都无法整除。
sign=1;
}
else if(mother%son==0)//这里是可以素数整除的情况1:分母比分子大
{
printf("%d/%d",son/son,mother/son);
sign=1;
}
else if(son%mother==0)//这里是可以素数整除的情况2:分母比分子小
{
printf("%d/%d",son/mother,mother/mother);
sign=1;
}//这三个分支判断都有一个sign=1,正是输出完毕的标志,如果程序没进入分支判断,
//那么sign一直为0,“公约数”循环继续(其实sign是为了满足单出口原则设立的。。。)
}
return 0;
}
如果对您有所帮助,那真是再好不过;如果您觉得我还有可改进的地方,还请指点一二。
标签:分子,分数,有意思,题目,int,最简,公约数,分享,分母 来源: https://blog.csdn.net/m0_62349134/article/details/121707303